Используя R для группировки данных по классу, получим сумму всех столбцов. - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть данные, которые выглядят так:

NAME     TYPE        REP     PRODUCT1   PRODUCT2  ...  PRODUCT30
Name1    Wholesale   HA      4500.00    0.00      ...  760.00
Name2    Retail      BM      89.00      0.00      ...  0.00
Name3    Wholesale   HA      1000.00    800.00    ...  0.00
Name4    Wholesale   BM      3000.00    100.00    ...  0.00
Name5    Wholesale   BM      2000.00    0.00      ...  0.00

Я хочу создать сводную таблицу, в которой указаны общие продажи ПРОДУКТА 1 - ПРОДУКТА 30 для каждого REP и ТИПА. Таким образом, результатом будет это

REP   TYPE       TOTAL1    TOTAL2  ...  TOTAL30
HA    Wholesale  5500.00   800.00       760.00
BM    Retail     89.00     0.00         0.00
BM    Wholesale  5000.00   100.00       0.00

Я пробовал разные варианты кода ниже, но безрезультатно

groupedsales <- group_by(sales, REP, TYPE) %>% summarise_all(sum())

Я знаю, что могу заставить его работать, используя

groupedsales <- group_by(sales, REP, TYPE) %>%    summarise(TOTAL1=sum(PRODUCT1), TOTAL2=sum(PRODUCT2), ... TOTAL30=sum(PRODUCT30)

Но я думаю, что должен быть более простой способ получить сумму каждого столбца. Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Используя data.table вы можете попробовать

df <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "NAME     TYPE        REP     PRODUCT1   PRODUCT2   PRODUCT30
Name1    Wholesale   HA      4500.00    0.00      760.00
                 Name2    Retail      BM      89.00      0.00       0.00
                 Name3    Wholesale   HA      1000.00    800.00     0.00
                 Name4    Wholesale   BM      3000.00    100.00     0.00
                 Name5    Wholesale   BM      2000.00    0.00       0.00")
library(data.table)
setDT(df)[,lapply(.SD,sum),by=.(TYPE, REP),.SDcols = names(df)[4:6]]

#returns
        TYPE REP PRODUCT1 PRODUCT2 PRODUCT30
1: Wholesale  HA     5500      800       760
2:    Retail  BM       89        0         0
3: Wholesale  BM     5000      100         0
0 голосов
/ 07 сентября 2018

Мы можем использовать aggregate от base R

aggregate(.~ REP + TYPE, df[-1], sum)

Или с summarise_at из dplyr

library(dplyr)
df %>%
   group_by(REP, TYPE) %>%
   summarise_at(vars(starts_with("PRODUCT")), sum) %>%
   rename_at(3:ncol(.), ~ paste0("TOTAL", seq_len(ncol(df) - 3)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...