根据区域数量 reshape 我的数据

标签 r dplyr tidyr

这是我的数据

information=structure(list(X = 1:15, Name = structure(c(1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("ABL", "ARP"
    ), class = "factor"), Zone = c(1L, 2L, 7L, 8L, 9L, 10L, 11L, 
    12L, 1L, 2L, 4L, 5L, 6L, 7L, 9L), X3 = c(1L, 1L, 1L, 1L, 2L, 
    2L, 1L, 1L, 3L, 0L, 1L, 2L, 0L, 1L, 0L), X2 = c(0L, 0L, 0L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), X5 = c(0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L), X4 = c(0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L), X1 = c(0L, 
    0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("X", 
    "Name", "Zone", "X3", "X2", "X5", "X4", "X1"), class = "data.frame", row.names = c(NA, -15L))

我希望所有 Name 有 12 个区域,当没有 Zone 关联时,Zone 将采用缺失值和 X1 中的值到 X5 将取 0。例如,请注意,对于 Name ARP 和 ABL,我没有每个区域 3。

我试过这段代码

library(tidyr)
library(dplyr)
    plot_data=information
    plot_data$Zone=(factor(plot_data$Zone, levels = c(1:12)))
    plot_data= plot_data %>%  left_join(data_frame(Zone= factor(1:12)), .)

它给了我:

     Zone     X   Name    X3    X2    X5    X4    X1
   (fctr) (int) (fctr) (int) (int) (int) (int) (int)
1       1     1    ABL     1     0     0     0     0
2       1     9    ARP     3     0     0     0     0
3       2     2    ABL     1     0     0     0     0
4       2    10    ARP     0     0     1     0     0
5       3    NA     NA    NA    NA    NA    NA    NA
6       4    11    ARP     1     0     0     1     0
7       5    12    ARP     2     0     0     0     0
8       6    13    ARP     0     0     1     0     0
9       7     3    ABL     1     0     0     0     0
10      7    14    ARP     1     0     0     0     0
11      8     4    ABL     1     1     0     0     0
12      9     5    ABL     2     0     0     0     0
13      9    15    ARP     0     1     0     0     0
14     10     6    ABL     2     0     0     0     1
15     11     7    ABL     1     0     0     0     0
16     12     8    ABL     1     0     0     0     0

我的代码有什么问题?

非常感谢!

最佳答案

首先,我们complete() 数据以确保所有Name 都有所有Zone。然后,我们将 X1X5 列中的 NA 替换为 0:

library(tidyr)
library(dplyr)

information %>%
  complete(Name, Zone) %>%
  replace_na(as.list(setNames(rep(0, 5), paste0("X", 1:5))))

给出:

#   Name Zone  X X3 X2 X5 X4 X1
#1   ABL    1  1  1  0  0  0  0
#2   ABL    2  2  1  0  0  0  0
#3   ABL    4 NA  0  0  0  0  0
#4   ABL    5 NA  0  0  0  0  0
#5   ABL    6 NA  0  0  0  0  0
#6   ABL    7  3  1  0  0  0  0
#7   ABL    8  4  1  1  0  0  0
#8   ABL    9  5  2  0  0  0  0
#9   ABL   10  6  2  0  0  0  1
#10  ABL   11  7  1  0  0  0  0
#11  ABL   12  8  1  0  0  0  0
#12  ARP    1  9  3  0  0  0  0
#13  ARP    2 10  0  0  1  0  0
#14  ARP    4 11  1  0  0  1  0
#15  ARP    5 12  2  0  0  0  0
#16  ARP    6 13  0  0  1  0  0
#17  ARP    7 14  1  0  0  0  0
#18  ARP    8 NA  0  0  0  0  0
#19  ARP    9 15  0  1  0  0  0
#20  ARP   10 NA  0  0  0  0  0
#21  ARP   11 NA  0  0  0  0  0
#22  ARP   12 NA  0  0  0  0  0

注意:正如@a​​osmith 所提到的,您可以使用 complete()fill 参数代替(它调用 replace_na 内部):

information %>%
  complete(Name, Zone, fill = as.list(setNames(rep(0, 5), paste0("X", 1:5))))

请注意,此方法仅对观察到的Zonecomplete()。由于您的初始数据中没有 Zone = 3,因此它不会将此 NameZone 组合添加到结果中。如果您想填充应该观察到但没有观察到的缺失值,您可以使用 full_seq():

information %>%
  complete(Zone = full_seq(Zone, period = 1), Name) %>%
  #just another way to replace NA in column X3 to X1
  mutate_each(funs(replace(., is.na(.), 0)), X3:X1)

关于根据区域数量 reshape 我的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37388330/

相关文章:

r - 存储(几乎)列表中工作区中的所有对象

r - group_rows()命令中换行时的缩进 - R markdown 中的 kableExtra 包

r - 在r中使用group_by函数后如何选择最低值或删除重复项

r - tidyr VS dplyr + reshape2

r - 在 R 中查找上一行的最后一个字符

r - 如何将 x 标签移动到 R 中 ggplot 中的分面标签上

r - 将 data.frame 转换为高维矩阵

r - 使用 "any"函数跨多个列的逻辑函数

r - 塑造数据并影响 R 中的计数列

r - 根据条件将值从一行复制到另一行