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