Как я могу суммировать векторы, вложенные в столбец фрейма данных?

#r #dataframe

#r #фрейм данных

Вопрос:

У меня есть фрейм данных, где один столбец содержит список. Я хочу преобразовать список в числовой формат и суммировать значения в новый столбец. В каждой строке есть столбец с вектором, подобным этому:

 c("47", "39", "1")
  

Новый столбец будет содержать сумму этих чисел и будет выглядеть следующим образом:

 List                  SumList
c("47", "39", "1")     87
c("11", "11")          22
c("1", "2")             3
  

Я попробовал пару разных подходов, но, похоже, ничто не дает нужного мне результата.

Пример фрейма данных:

 DF <- structure(list(list = structure(list(c("47", "39", "1"), c("11", 
"11"), c("1", "2")))), class = "data.frame", row.names = c(NA, -3L))
  

Комментарии:

1. К вашему сведению, обычно хорошей идеей является включение кода, который воспроизводит данные вашего примера. Ваш пост был отредактирован, чтобы включить лучшее предположение, которое у кого-либо есть, хотя мы не можем быть уверены, что оно правильное.

2. Извинения. Обязательно включу образец в следующий раз.

Ответ №1:

Вы можете выполнить то, что хотите, используя функции dplyr rowwise и mutate.

Пример:

 library(dplyr)
df <- tibble(List = list(c("47", "39", "1"), c("11","11"), c("1","2"))) %>% 
  rowwise() %>% 
  mutate(SumList = sum(as.numeric(List)))
  

Ответ №2:

1) Предполагая фрейм данных в примечании в конце, попробуйте следующий код. Пакеты не используются.

 transform(DF, sum = sapply(list, function(x) sum(as.numeric(x))))
  

предоставление:

        list sum
1 47, 39, 1  87
2    11, 11  22
3      1, 2   3
  

2) Другой подход заключается в преобразовании DF в длинную форму, а затем суммировании, дающем тот же результат. Снова пакеты не используются.

 long <- stack(setNames(DF$list, seq_along(DF$list)))
transform(DF, sum = rowsum(as.numeric(long$value), long$ind))
  

Примечание

Входные данные в воспроизводимой форме:

 DF <- structure(list(list = structure(list(c("47", "39", "1"), c("11", 
"11"), c("1", "2")))), class = "data.frame", row.names = c(NA, -3L))
  

Ответ №3:

Вот purrr решение, которое использует map_dbl .

 library(dplyr)
library(tibble)
library(purrr)

tibble(x = list(c("47", "39", "1"), c("11","11"), c("1","2"))) %>% 
  mutate(Sum = map_dbl(x, function(i)sum(as.numeric(i))))
#> # A tibble: 3 x 2
#>   x           Sum
#>   <list>    <dbl>
#> 1 <chr [3]>    87
#> 2 <chr [2]>    22
#> 3 <chr [2]>     3
  

Создано 2019-03-20 пакетом reprex (версия 0.2.1)

Ответ №4:

Предположим, мы используем структуру Г. Гротендика:

 DF <- structure(list(list = structure(list(c("47", "39", "1"), c("11", 
                                                                 "11"), c("1", "2")))), class = "data.frame", row.names = c(NA, -3L))

DF$SumList <-lapply(1:nrow(DF), function(x) sum(as.double(unlist(DF$list[x]))))
  

И с прямым вводом:

 DF$SumList <-lapply(1:nrow(DF), function(x) sum(as.double(DF$list[[x]])))