Kal*_*lin 5 r list melt reshape2
我发现自己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"))
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)
你可以尝试
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)
对于更新的问题,使用 并不容易unnest。unnest需要多次调用
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)