繁体   English   中英

R 数据帧中列表的总和

[英]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

您可以在rowwisedplyr使用

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM