R数据框中列表的总和

Sum of a list in R data frame

我的数据框中有一个“列表”类型的列,我想创建一个包含总和的列。

我想没有视觉差异,但我的专栏由 list(1,2,3) 组成,而不是 c(1,2,3) :

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,它应该 return 类型为 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

您可以在 dplyr

中使用 rowwise
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)