tidyr ::收集多个不同类型的列

时间:2019-04-09 23:32:02

标签: r reshape tidyr

我正在尝试使用tidyr从宽格式转换为长格式,以收集具有不同类型的多个列。与问题here基本相同。我是R新手,不熟悉语法,因此可能会犯一些明显的错误。

我的数据如下:

print(c)

我尝试了以下代码:

ID    X_1_abc  X_1_xyz    X_2_abc    X_2_xyz   X_3_abc   X_3_xyz
1       1        1          2          2         2         1
2       1        2          1          0         1         NA 
3       1        2          1          1         NA        0

但这只给了我两列:一列列出变量,一列列出值。

df %<>% gather(var, val, X_1_abc:X_3_xyz) %>%   
  separate(var, c('var', 'X_number'), sep = 'X_*_', convert = TRUE) %>% 
  spread(var, val, convert = TRUE) 

我正在寻找以下内容:

ID  X_num `<NA>`
1   1_abc  1     
1   1_xyz  1     
1   2_abc  2     
1   2_xyz  2     
1   3_abc  2     
1   3_xyz  1 

1 个答案:

答案 0 :(得分:2)

我认为您的预期输出不完整,因为我没有看到ID = 2ID = 3的任何条目。

您可以执行以下操作

df %>%
    gather(k, v, -ID) %>%
    separate(k, into = c("tmp", "X_num", "ss"), sep = "_") %>%
    select(-tmp) %>%
    spread(ss, v)
#  ID X_num abc xyz
#1  1     1   1   1
#2  1     2   2   2
#3  1     3   2   1
#4  2     1   1   2
#5  2     2   1   0
#6  2     3   1  NA
#7  3     1   1   2
#8  3     2   1   1
#9  3     3  NA   0