dplyr - поэлементное суммирование во вложенных списках - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть следующее data.frame:

df <- data.frame(X1 = c(1,2,2))
df$X2 <- list(list(1, 2), list(0, 1), list(1,0))

df
  X1    X2
1  1  1, 2
2  2  0, 1
3  2  1, 0

Теперь я хотел бы добавить новый столбец, который является поэлементным средним значением всех списков в X2, которые разделяютто же самое значение X1, например:

  X1  mean
1  1  1, 2
2  2  0.5, 0.5

Я попытался выполнить следующие инструкции:

df %>% group_by(X1) %>% summarise(mean = mean(X2))

Но все, что я получил, это

     X1  mean
  <dbl> <dbl>
1  1.00    NA
2  2.00    NA
Warning messages:
1: In mean.default(X2) : argument is not numeric or logical: returning NA

Как я могу построить этот новый столбец?

1 Ответ

0 голосов
/ 09 февраля 2019

Мы можем использовать

df <- df %>% group_by(X1) %>% 
  summarise(mean = list(map(reduce(X2, `map2`, `+`), `/`, n())))
df$mean
# [[1]]
# [[1]][[1]]
# [1] 1
#
# [[1]][[2]]
# [1] 2
#
#
# [[2]]
# [[2]][[1]]
# [1] 0.5
#
# [[2]][[2]]
# [1] 0.5

Объяснение : сначала, после группировки, с помощью

reduce(X2, `map2`, `+`)

мы добавляем все списки поэлементно.Тогда, чтобы получить среднее значение, мы используем map с /.Наконец, list возвращает список.

Обновление : вы также можете использовать

df %>% group_by(X1) %>%
  summarise(mean = list(pmap(X2, ~ sum(...) / n())))

или

df %>% group_by(X1) %>%
  summarise(mean = list(pmap(X2, ~ mean(c(...)))))

К сожалению list(pmap(X2, mean))не работает как

mean(1, 2)
# [1] 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...