dplyr-嵌套列表中的按元素汇总

时间:2019-02-09 14:14:22

标签: r dataframe dplyr

我有以下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 :(得分:3)

我们可能会使用

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