将宽形状重塑为长形状,保留行名中的 ID 变量

Use*_*239 2 r reshape2

我正在尝试将以下数据转换为 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?感谢您的任何提示。我知道一种通过转置数据的方法,但这似乎是实现此目的的一种相当低效的方法。

Dan*_*n Y 5

@阿克伦的有用答案:

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)