这个问题在这里已有答案:
假设我有以下宽/杂乱的数据帧:
df1 <- data.frame(ID = c(1, 2), Gender = c("M","F"),
Q1 = c(1, 5), Q2 = c(2, 6),
Q3 = c(3, 7), Q4 = c(4, 8))
ID Gender Q1 Q2 Q3 Q4
1 M 1 2 3 4
2 F 5 6 7 8
如何将其转换为此数据框:
df2 <- data.frame(ID = c(1, 1, 2, 2), Gender = c("M", "M", "F", "F"),
V1 = c(1, 3, 5, 7), V2 = c(2, 4, 6, 8))
ID Gender V1 V2
1 M 1 2
1 M 3 4
2 F 5 6
2 F 7 8
我知道有多个包和函数(例如,tidyr,reshape2,reshape函数)可以实现这一点 . 这是最简单的方法,如何做?非常感谢任何人都能提供的帮助 . 谢谢!
1 回答
您可以从
data.table
的开发版本中尝试melt
,即v1.9.5
. 它可以将measure.vars
中的多个变量作为列表 . 安装devel版本的说明是here或者使用
reshape
来自base R
更新
如果我们需要将'df2'转换回'df1',可以使用
data.table
中的dcast
. 它可能需要多个value.var
列 . 在继续dcast
之前,我们需要按组('ID','Gender')创建一个序列列(N
)或者我们使用
ave
按组创建序列,然后使用base R
中的reshape
.数据