【发布时间】:2015-04-15 19:08:26
【问题描述】:
问题
我发现自己使用reshape2::melt 从data.frame 的分层list 对象中获取单个“长”data.frame。但是,结果的列名称具有标记为“L1”、“L2”等的列表层次结构级别。但是,由于这些级别有意义,我想给这些列赋予有意义的名称。最好的方法是什么?可以通过对melt 的一次调用来完成吗?
我没有与melt 或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
【问题讨论】: