如何在列表中使用reshape2 :: melt时指定级别名称?

Kal*_*lin 5 r list melt reshape2

我发现自己reshape2::melt用来data.frame从一个层次listdata.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"))
Run Code Online (Sandbox Code Playgroud)

当我使用时melt(x),我得到气缸计数的列名"L1"和齿轮计数的"L2".我希望该列分别代表" cylinders"和" gears".

mx <- melt(x)
Run Code Online (Sandbox Code Playgroud)

这是输出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
Run Code Online (Sandbox Code Playgroud)

所以,我手动设置"L1"和"L2":

names(mx)[3:4] <- c("gears", "cylinders")
Run Code Online (Sandbox Code Playgroud)

期望的输出

这是所需的最终列名称设置.我希望能够实现这一点,而无需手动重置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
Run Code Online (Sandbox Code Playgroud)

akr*_*run 3

你可以尝试

library(tidyr)
res <- unnest(x, sex)
head(res)
#   sex  Hair   Eye value
#1 MALE Black Brown    32
#2 MALE Brown Brown    53
#3 MALE   Red Brown    10
#4 MALE Blond Brown     3
#5 MALE Black  Blue    11
#6 MALE Brown  Blue    50
Run Code Online (Sandbox Code Playgroud)

对于更新的问题,使用 并不容易unnestunnest需要多次调用

library(dplyr)
dN <- unnest(lapply(x, unnest, gear), cylinders) %>%
                         gather(variable, value, mpg:qsec)
head(dN,3)
#  cylinders   gear variable value
#1     cyl_6 gear_3      mpg     1
#2     cyl_6 gear_3      mpg     2
#3     cyl_6 gear_4      mpg     5
Run Code Online (Sandbox Code Playgroud)