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)
我的数据框中有一个“列表”类型的列,我想创建一个包含总和的列。
我想没有视觉差异,但我的专栏由 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)