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

tidyr:: gather multiple columns different types

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

我的数据是这样的:

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 

我正在寻找以下内容:

ID   X_num   abc   xyz
1     1       1     1    
1     2       2     2
1     3       2     1

我认为您的预期输出不完整,因为我没有看到 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