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

标签 r list reshape2 melt

问题

我发现自己在使用 reshape2::melt获得单个“长”data.frame来自分层 listdata.frame对象。但是,结果的列名称具有标记为“L1”、“L2”等的列表层次结构级别。但是,由于这些级别有意义,我想给这些列赋予有意义的名称。最好的方法是什么?可以通过对 melt 的单次调用来完成吗? ?

我没有结婚 meltreshape2 ,所以我对其他方法或软件包持开放态度。

当前设置

假设我们有一个 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

最佳答案

你可以试试

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

对于更新的问题,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

关于r - 在列表上使用 reshape2::melt 时如何指定级别名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29658736/

相关文章:

r - 摘要 {Hmisc} 丢弃类别?

C# 根据多个条件过滤列表中的项目

Java - 不同的对象列表

使用重复项 reshape 数据框

r - 计算总和矩阵

r - R中多个变量的高值和低值并排显示geom_boxplot?

R,迭代矩阵的行向量

R 统计分布绘图

Python:如何在列表列表中添加 'find' 内容

r - 字符串匹配记录以计算数据框中的所有实例