我正在尝试使用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
答案 0 :(得分:2)
我认为您的预期输出不完整,因为我没有看到ID = 2
和ID = 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