列的某些值的访问元素列表

时间:2018-09-21 12:19:18

标签: r list

我有一个类似

的对象
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和E6。每个name可能总共只出现一次,也可能不止一次。如示例所示,它们既不在每个data.frame中的同一位置,也不根本不在每个name中的每个data.frame

如有必要,我可以提供列表中出现的所有name,但即时生成它会更加方便。

4 个答案:

答案 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)

我们可以使用Reducerbind数据框,并按名称使用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