我正在尝试将以下数据转换为 R 中的长格式:
testdata <- data.frame(rnorm(10),rnorm(10),rnorm(10))
rownames(testdata) <- paste0("ID",1:10) # Ids
colnames(testdata) <- c(2001,2002,2003) # Years
testdata
Run Code Online (Sandbox Code Playgroud)
所以列 = 时间,行 = ID。应该不会太难,但在所有示例中我发现情况恰恰相反。如何在任何其他流行的数据帧包中完成此datatable
操作reshape
?感谢您的任何提示。我知道一种通过转置数据的方法,但这似乎是实现此目的的一种相当低效的方法。
@阿克伦的有用答案:
reshape2::melt(as.matrix(testdata))
Run Code Online (Sandbox Code Playgroud)
“但是为什么?” 部分:
行名中包含重要信息,这通常不是存储重要信息的好地方。当我们重塑时我们需要这些信息。那么问题就变成了,melt
如果我们输入矩阵而不是数据框,为什么要使用这些信息呢?
原因是这melt
是一个通用函数,它根据您输入的数据类型分派一个方法(也称为更具体的函数)。因此,如果m
是一个矩阵并且您调用melt(m)
,则 R 实际上正在执行melt.matrix(m)
。相反,如果df
是一个数据帧并且您调用melt(df)
,则 R 实际上正在执行melt.data.frame(df)
。这两个函数 -melt.matrix()
和melt.data.frame()
- 以不同的方式处理行名;该方法melt.matrix
按照您想要的方式使用这些行名,而该方法melt.data.frame
则不然。因此,为了获得所需的输出,您需要将矩阵(而不是数据帧)输入到melt
.
只是为了演示,如果我们将 ID 信息存储在 data.frame 的列中(如下所示testdata2
)而不是行名称(如上所示testdata
),那么我们就可以在数据帧中输入数据到melt
:
testdata2 <- data.frame(
ID = 1:10,
year2001 = rnorm(10),
year2002 = rnorm(10),
year2003 = rnorm(10) )
reshape2::melt(testdata2, "ID")
reshape2::melt(testdata2, id.vars="ID", measure.vars=2:4) #equivalently, but verbosely
Run Code Online (Sandbox Code Playgroud)