доступ к списку элементов для некоторых значений столбца - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть объект типа

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 s, соответствующая A, равной 10, для B 10 тоже C 11, D 4 иE 6. Каждый name может встречаться всего один раз или более одного раза.Как показывает пример, они не находятся ни в одном и том же месте в каждом data.frame, ни в каждом name обязательно в каждом data.frame.

При необходимости я мог бы предоставить все name s, которые появляются в списке, но было бы еще удобнее генерировать их на лету.

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Вот один вариант с 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
0 голосов
/ 21 сентября 2018

Мы можем использовать 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
0 голосов
/ 21 сентября 2018

Другим вариантом может быть использование do.call для оценки rbind до руки и агрегирование после

aggregate(y ~ name, do.call(rbind, my.list), sum)
0 голосов
/ 21 сентября 2018

С 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...