我有以下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
如何构建这个新专栏?
最佳答案
我们可能会使用
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
关于r - dplyr - 在嵌套列表中按元素汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54607053/