сумма по условию в data.table в R - PullRequest
0 голосов
/ 26 мая 2020

пример data.table:

example <- data.table(name=c('black','black','black','red','red'),
                 type=c('chair','chair','sofa','sofa','plate'),
                 num=c(4,5,12,4,3), 
                 cost = c(20,22,219,17,4))

Я хочу резюмировать эту data.table. Для каждого имени я хочу знать, сколько там предметов. Тогда мне также интересно узнать стоимость стульев, диванов и тарелок для каждого цвета. Итак, я бы получил:

example <- data.table(name=c('black','red'),
                      count=c(3,2),
                      chair = c(44,0), plate = c(0,4), NOsofa = c(219,17))

я могу получить счет:

example[,.(count = .N), by="name"]

, но не могу создать оставшиеся столбцы?

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Вы можете сначала добавить count для каждого name.

library(data.table)
example[,count := .N, name]

Затем sum стоимость и изменение формы

dcast(example[, .(cost  = sum(cost)), .(name, type, count)], 
          name + count~type, value.var = 'cost', fill = 0)


#    name count chair plate sofa
#1: black     3    42     0  219
#2:   red     2     0     4   17

Используя tidyverse, это можно сделать как:

library(dplyr)

example %>%
  group_by(name) %>%
  mutate(count = n()) %>%
  group_by(type, count, add = TRUE) %>%
  summarise(cost = sum(cost)) %>%
  tidyr::pivot_wider(names_from = type, values_from = cost, 
         names_prefix = 'NO', values_fill = list(cost = 0))
0 голосов
/ 26 мая 2020

Мы можем использовать fun.aggregate в dcast и выполнить соединение

library(data.table)
dcast(example, name ~ type, value.var = 'cost', sum)[example[,
     .(count = .N), name], on = .(name)]
#    name chair plate sofa count
#1: black    42     0  219     3
#2:   red     0     4   17     2
...