问题
我发现自己使用从对象层次结构中reshape2::melt
获取单个“长” 。但是,结果的列名具有标记为“L1”、“L2”等的列表层次结构级别。但是,由于这些级别有意义,我想给这些列赋予有意义的名称。最好的方法是什么?可以使用单个调用来完成吗?data.frame
list
data.frame
melt
我不喜欢melt
or reshape2
,所以我对其他方法或包持开放态度。
当前设置
假设我们有一个data.frame
对象的分层列表,如下所示:
library(reshape2)
x <- structure(list(cyl_6 = structure(list(gear_3 = structure(list( mpg = 1:2, qsec = 3:4), .Names = c("mpg", "qsec"), row.names = c(NA, -2L), class = "data.frame"), gear_4 = structure(list(mpg = 5:6, qsec = 7:8), .Names = c("mpg", "qsec"), row.names = c(NA, -2L), class = "data.frame")), .Names = c("gear_3", "gear_4")), cyl_8 = structure(list(gear_3 = structure(list(mpg = 9:10, qsec = 11:12), .Names = c("mpg", "qsec"), row.names = c(NA, -2L), class = "data.frame"), gear_4 = structure(list(mpg = 13:14, qsec = 15:16), .Names = c("mpg", "qsec"), row.names = c(NA, -2L), class = "data.frame")), .Names = c("gear_3", "gear_4" ))), .Names = c("cyl_6", "cyl_8"))
当我使用 时melt(x)
,我得到列名“L1”表示汽缸数,“L2”表示齿轮数。我希望专栏分别改为“ cylinders
”和“ gears
”。
mx <- melt(x)
这是 的输出head(mx)
。我不希望它只说“L1”和“L2”:
1> head(mx)
variable value L2 L1
1 mpg 1 gear_3 cyl_6
2 mpg 2 gear_3 cyl_6
3 qsec 3 gear_3 cyl_6
4 qsec 4 gear_3 cyl_6
5 mpg 5 gear_4 cyl_6
6 mpg 6 gear_4 cyl_6
所以,我求助于手动设置“L1”和“L2”:
names(mx)[3:4] <- c("gears", "cylinders")
期望的输出
这是所需的最终列名设置。我希望能够在不手动重置 mx 的“名称”作为单独步骤的情况下实现这一目标。
1> head(mx)
variable value gears cylinders
1 mpg 1 gear_3 cyl_6
2 mpg 2 gear_3 cyl_6
3 qsec 3 gear_3 cyl_6
4 qsec 4 gear_3 cyl_6
5 mpg 5 gear_4 cyl_6
6 mpg 6 gear_4 cyl_6