我有以下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
如何建立新列?
答案 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