我有一个类似
的对象d1 <- data.frame(name=c("A","B","C"), y=c(4,5,6))
d2 <- data.frame(name=c("A","C","D"), y=c(6,5,4))
d3 <- data.frame(name=c("B","C","E"), y=c(5,2,6))
my.list <- list(d1, d2, d3)
我想访问y
中与name
中的每个条目相对应的所有元素。
也就是说,我的目标是使y
等于10的A
也等于B
对应的C
等于10的结果。 D
4和E
6。每个name
可能总共只出现一次,也可能不止一次。如示例所示,它们既不在每个data.frame
中的同一位置,也不根本不在每个name
中的每个data.frame
。
如有必要,我可以提供列表中出现的所有name
,但即时生成它会更加方便。
答案 0 :(得分:2)
使用dplyr
:
(请注意,如果您转换name
as.character
,而不是as.factor
,这是可行的)
d1 <- data.frame(name=c("A","B","C"), y=c(4,5,6), stringsAsFactors = F)
d2 <- data.frame(name=c("A","C","D"), y=c(6,5,4), stringsAsFactors = F)
d3 <- data.frame(name=c("B","C","E"), y=c(5,2,6), stringsAsFactors = F)
my.list <- list(d1, d2, d3)
library(dplyr)
my.list %>% bind_rows() %>% group_by(name) %>% summarise(sum_y = sum(y))
# A tibble: 5 x 2
name sum_y
<chr> <dbl>
1 A 10
2 B 10
3 C 13
4 D 4
5 E 6
我们可以bind_rows()
然后简单地group_by()
的名字和sum()
。
答案 1 :(得分:2)
另一种选择是使用do.call
,以便在事前评估rbind
,并在事后进行汇总
aggregate(y ~ name, do.call(rbind, my.list), sum)
答案 2 :(得分:1)
我们可以使用Reduce
,rbind
数据框,并按名称使用aggregate
Reduce(function(x, y) aggregate(y~name, rbind(x, y), sum), my.list)
# name y
#1 A 10
#2 B 10
#3 C 13
#4 D 4
#5 E 6
答案 3 :(得分:1)
这是data.table
library(data.table)
rbindlist(my.list)[, .(sum_y = sum(y)), .(name)]
# name sum_y
#1: A 10
#2: B 10
#3: C 13
#4: D 4
#5: E 6