Агрегат на две колонки - PullRequest
       6

Агрегат на две колонки

0 голосов
/ 30 августа 2018

У меня есть набор данных с ценами товаров из разных отделов магазина, который выглядит примерно так:

Item,Chain,Branch1,Branch2,Branch3
Laptop,Sears,1000,1100,900
Laptop,JCP,1300,900,1200
Laptop,Macys,1500,1800,1700
TV,Sears,800,600,700
TV,JCP,400,600,700
TV,Macys,900,1000,1100

Что я хочу: Для каждой уникальной комбинации Предмета и Цепочки вычислите срединную цену из трех ветвей.

Я пробовал что-то вроде

aggregate(data[,3:5], list(data$Item, data$Chain), median)

Но это не сработало. Любые идеи о том, как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Проблема в том, что aggregate() агрегирует каждый столбец .

Для полноты картины вот несколько альтернативных подходов:

1. База R по рядам apply()

dat$median <- apply(dat[, 3:5], 1L, median)
dat
     Item Chain Branch1 Branch2 Branch3 median
1: Laptop Sears    1000    1100     900   1000
2: Laptop   JCP    1300     900    1200   1200
3: Laptop Macys    1500    1800    1700   1700
4:     TV Sears     800     600     700    700
5:     TV   JCP     400     600     700    600
6:     TV Macys     900    1000    1100   1000

2. data.table

library(data.table)
setDT(dat)[, .(median = median(c(Branch1, Branch2, Branch3))), by = .(Item, Chain)]
     Item Chain median
1: Laptop Sears   1000
2: Laptop   JCP   1200
3: Laptop Macys   1700
4:     TV Sears    700
5:     TV   JCP    600
6:     TV Macys   1000

3. data.table после преобразования в длинный формат

В соответствии с предложением neilfws изменить формат с широкого на длинный перед агрегированием:

library(data.table)
melt(setDT(dat), c("Item", "Chain"))[, .(median = median(value)), by = .(Item, Chain)]
     Item Chain median
1: Laptop Sears   1000
2: Laptop   JCP   1200
3: Laptop Macys   1700
4:     TV Sears    700
5:     TV   JCP    600
6:     TV Macys   1000

Данные

Поскольку data и df являются именами функций R, я буду использовать другое имя, чтобы избежать риска трудной отладки конфликтов имен:

dat <- data.table::fread("
Item,Chain,Branch1,Branch2,Branch3
Laptop,Sears,1000,1100,900
Laptop,JCP,1300,900,1200
Laptop,Macys,1500,1800,1700
TV,Sears,800,600,700
TV,JCP,400,600,700
TV,Macys,900,1000,1100")
0 голосов
/ 30 августа 2018

Вы можете использовать group_by() и summarise():

library(dplyr)

df <- data_frame(Item = c("Laptop","Laptop","Laptop","TV","TV","TV"),
                 Chain = c("Sears","JCP","Macys","Sears","JCP","Macys"),
                 Branch1 = c(1000,1300,1500,800,400,900),
                 Branch2 = c(1100,900,1800,600,600,1000),
                 Branch3 = c(900,1200,1700,700,700,1100))

df %>%
  group_by(Item, Chain) %>%
  summarise(median = median(c(Branch1, Branch2, Branch3)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...