Как суммировать векторы, вложенные в столбец фрейма данных? - PullRequest
1 голос
/ 20 марта 2019

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

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))

Ответы [ 4 ]

4 голосов
/ 20 марта 2019

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

Пример:

library(dplyr)
df <- tibble(List = list(c("47", "39", "1"), c("11","11"), c("1","2"))) %>% 
  rowwise() %>% 
  mutate(SumList = sum(as.numeric(List)))
3 голосов
/ 20 марта 2019

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))
2 голосов
/ 20 марта 2019

Вот решение 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 пакетом Представления (v0.2.1)

0 голосов
/ 20 марта 2019

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

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]])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...