Проблема в том, что 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")