我有一个R结构元素列表如下:
[[1]]
value weight
[1,] 1 0.085308057
[2,] 1 0.251184834
[3,] 1 0.009478673
[4,] 1 0.180094787
[5,] 1 0.445497630
[6,] 1 0.028436019
[[2]]
value weight
[1,] 1 0.1753555
[2,] 2 0.1706161
[3,] 1 0.3317536
[4,] 3 0.3222749
我正在尝试为每个"值"添加权重。列表中每个级别的类别将导致类似以下内容:
Unit value weight
1 1 1.0000000
2 1 0.5071091
2 2 0.1706161
2 3 0.3222749
大约有2000个单位"我需要总结一下,所以在没有循环函数的情况下分别从每个值中提取值是不可行的,但是我在编写代码来执行此任务时遇到了麻烦。
我也理解我可以将列表转换为数据帧以执行这些计算,但由于列表中的每个元素都有不同的行数,因此我不确定如何执行此操作。
我还是新学习R,所以任何帮助都将不胜感激!
答案 0 :(得分:2)
因此,使用rbindlist
软件包v> = 1.9.5中的data.table
可以很容易地解决这个问题(有关安装说明,请参阅here)
我不确定您的列表是否包含data.frame
或矩阵。如果是晚些时候,首先(我们将调用您的列表l
)
l <- lapply(l, as.data.frame)
然后,解决方案是直截了当的
library(data.table)
rbindlist(l, idcol = "Unit")[, .(weight = sum(weight)), by = .(Unit, value)]
# Unit value weight
# 1: 1 1 1.0000000
# 2: 2 1 0.5071091
# 3: 2 2 0.1706161
# 4: 2 3 0.3222749
或者,使用tidyr
和dplyr
包的组合可以实现相同的结果
library(tidyr)
library(dplyr)
unnest(l, "Unit") %>%
group_by(Unit, value) %>%
summarise(weight = sum(weight))
# Source: local data frame [4 x 3]
# Groups: Unit
#
# Unit value weight
# 1 X1 1 1.0000000
# 2 X2 1 0.5071091
# 3 X2 2 0.1706161
# 4 X2 3 0.3222749