![](/img/trans.png)
[英]R: sum the elements of each list on a list and return the result in a data frame
[英]Sum of a list in R data frame
我的数据框中有一列“列表”类型,我想用总和创建一列。
我想没有视觉差异,但我的专栏由list(1,2,3)
s 而不是c(1,2,3)
s 组成:
tibble(
MY_DATA = list(
list(2, 7, 8),
list(3, 10, 11),
list(4, 2, 8)
),
NOT_MY_DATA = list(
c(2, 7, 8),
c(3, 10, 11),
c(4, 2, 8)
)
)
不幸的是,当我尝试mutate(NEW_COL = MY_LIST_COL_D %>% unlist() %>% sum())
时,结果是新列中的每个单元格都包含整个源列的总和(因此值以百万计)
我尝试了reduce
,它确实有效,但速度很慢,我正在寻找更好的解决方案。
您可以使用purrr::map_dbl
,它应该返回一个double
类型的向量:
library(tibble)
library(dplyr)
library(purrr)
df = tibble(
MY_LIST_COL_D = list(
c(2, 7, 8),
c(3, 10, 11),
c(4, 2, 8)
)
)
df %>%
mutate(NEW_COL= map_dbl(MY_LIST_COL_D, sum), .keep = 'unused')
# NEW_COL
<dbl>
# 1 17
# 2 24
# 3 14
这是你要找的吗? 如果您不想删除列表列,请忽略.keep
参数。
更新由于底层结构是列表,您仍然可以应用相同的逻辑,但解决问题的一种方法是unlist
:
df = tibble(
MY_LIST_COL_D = list(
list(2, 7, 8),
list(3, 10, 11),
list(4, 2, 8)
)
)
df %>%
mutate(NEW_COL = map_dbl(MY_LIST_COL_D, ~ sum(unlist(.x))), .keep = 'unused')
# NEW_COL
# <dbl>
# 1 17
# 2 24
# 3 14
您可以在rowwise
中dplyr
使用
library(dplyr)
df %>% rowwise() %>% mutate(NEW_COL = sum(MY_LIST_COL_D))
rowwise
也会使您的尝试生效:
df %>% rowwise() %>% mutate(NEW_COL = MY_LIST_COL_D %>% unlist() %>% sum())
也可以在基础 R 中使用sapply
:
df$NEW_COL <- sapply(df$MY_LIST_COL_D, sum)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.