Рассчитать значения в «длинном формате» в R - PullRequest
1 голос
/ 22 апреля 2019

Я ищу способ вычисления значений во фрейме данных формата LONG без переключения между длинными и широкими форматами.Структура фрейма данных в основном такова:

index <- rep(seq(1:3),2)
category <- c("a","a","a","b","b","b")
value <- c(3,6,8,9,7,4)
df <- data.frame(index, category,value, stringsAsFactors = FALSE)

Скажем, мне нужно вычислить новую категорию, c, сложив a и b.Это очень легко сделать, преобразовав фрейм данных в «широкий» формат с category в качестве ключевого столбца, добавив новую переменную c путем вычисления и переключившись обратно в «длинный» формат.

ОднакоУ меня есть сотни новых категорий, которые можно рассчитать из сотен исходных элементов, и это было бы очень трудоемким решением.Я уверен, что должен быть разумный путь, но я не смог его найти.Есть идеи?Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 апреля 2019

Мы можем использовать data.table

library(data.table)
rbind(setDT(df), df[, .(category = 'c', value = sum(value)), index])
#    index category value
#1:     1        a     3
#2:     2        a     6
#3:     3        a     8
#4:     1        b     9
#5:     2        b     7
#6:     3        b     4
#7:     1        c    12
#8:     2        c    13
#9:     3        c    12
1 голос
/ 22 апреля 2019

С помощью dplyr мы можем group_by index сопоставить значения, sum values для каждой группы и связать строки с исходным кадром данных.

library(dplyr)

bind_rows(df, df %>%
               group_by(index) %>%
               summarise(category = 'c',
               value = sum(value)))


#  index category value
#1     1        a     3
#2     2        a     6
#3     3        a     8
#4     1        b     9
#5     2        b     7
#6     3        b     4
#7     1        c    12
#8     2        c    13
#9     3        c    12

То же самое с базой R будет использовать aggregate и rbind

rbind(df, transform(aggregate(value~index, df, sum), category = 'c'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...