R 两列聚合
我有一个数据集,包含商店不同分支机构的商品价格,看起来有点像这样:R 两列聚合,r,R,我有一个数据集,包含商店不同分支机构的商品价格,看起来有点像这样: 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 我想要的是:对于每个独特的商品和连锁店组合,计算三个分支店的中间价 我尝试
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)
但它不起作用。关于如何解决这个问题,你有什么想法吗?你可以使用groupby()
和summary()
:
库(dplyr)
df%
分组依据(项目、链)%>%
总结(中位数=中位数(c(Branch1、Branch2、Branch3)))
您可以使用分组依据()
和摘要()
:
库(dplyr)
df%
分组依据(项目、链)%>%
总结(中位数=中位数(c(Branch1、Branch2、Branch3)))
问题在于聚合()
聚合每一列
为完整起见,以下是一些替代方法:
1.基本R行方向apply()
2. <代码>数据表
3. <代码>数据.表格在重新调整为长格式后
在聚合之前,请执行以下操作以将宽格式重塑为长格式:
library(data.table)
melt(setDT(dat), c("Item", "Chain"))[, .(median = median(value)), by = .(Item, Chain)]
资料
由于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")
dat问题在于aggregate()
聚合每一列
为完整起见,以下是一些替代方法:
1.基本R行方向apply()
2. <代码>数据表
3. <代码>数据.表格在重新调整为长格式后
在聚合之前,请执行以下操作以将宽格式重塑为长格式:
library(data.table)
melt(setDT(dat), c("Item", "Chain"))[, .(median = median(value)), by = .(Item, Chain)]
资料
由于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")
datItem
的每个组合只有一行,Chain
是一个SQL标记,您可以执行:聚合(分支~Item+Chain,重塑(数据,3:5,dir=“long”,sep=”“),中值)
Item
的每个组合只有一行,Chain
是一个SQL标记,您可以这样做:aggregate(Branch~Item+Chain,restrape(data,3:5,dir=“long”,sep=“”),media)
您也可以在分组之前收集(Branch,Price,-Item,-Chain),然后进行总结(media=media(Price))。您还可以在分组之前收集(分支、价格、-项目、-链),然后进行汇总(中位数=中位数(价格))。
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
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
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")