如果有人回答,我道歉 - 我找不到它!为了简化,我有一个包含2个相关列的汽车数据框:里程和价格。我想计算0-20,000英里,20,000-40,000等车辆的平均价格和车辆数量(在20,000英里的“箱子”中)。我一直在为各种里程范围制作数据子集,然后查看该子集的平均值和数量或车辆。我想知道是否有更有效的方法来做到这一点,而不是制作所有这些子集 - 我用各种“箱”和数据做了很多次。我很乐意学习这种方式。
谢谢!
答案 0 :(得分:2)
您可能希望沿着这些方向发展:
library(data.table)
d = data.table(mileage = runif(1000, 0, 100000), price = runif(1000, 15000, 35000))
d[, list(price = mean(price), number = .N),
by = cut(mileage, c(0, 20000, 25000, 30000, 100000))][order(cut)]
# cut price number
# 1: (0,2e+04] 25252.70 215
# 2: (2e+04,2.5e+04] 25497.66 46
# 3: (2.5e+04,3e+04] 25349.79 45
# 4: (3e+04,1e+05] 25037.93 694
答案 1 :(得分:1)
这显示了如何使用聚合在一次运行中按类别返回多个统计信息。
# Using Quentin's data
d[['mileage.cat']] <- cut(d$mileage, breaks=seq(0, 200000, by= 20000))
aggregate(d$price, d['mileage.cat'] ,
FUN=function(price) c(counts=length(price),
mean.price=mean(price) ) )
mileage.cat x.counts x.mean.price
1 (0,2e+04] 212.00 24859.01
2 (2e+04,4e+04] 194.00 24343.16
3 (4e+04,6e+04] 196.00 24357.73
4 (6e+04,8e+04] 191.00 25006.71
5 (8e+04,1e+05] 207.00 25250.23
答案 2 :(得分:0)
制作垃圾箱,“切”。例如:
x=1:10
bkpt=c(0,2.5,7.5,10)
x.cut=cut(x,breaks=bkpt)
这样完成了。 y是以后的一些数据:
y=21:30
data.frame(x,x.cut,y)
要计算每个组的内容,请使用tapply。按照我的例子:
tapply(y,x.cut,length)
tapply(y,x.cut,mean)
计算(a)y的数量和(b)x.cut定义的每个组中y的平均值。
答案 3 :(得分:0)
使用聚合的另一种方法:
df <- data.frame(mil = sample(1e5,20),price = sample(1000,20) )
#mil2 is our "mile bin" ( 0 -> [0:20000[; 1 -> [20000:40000[ ...)
df$mil2 = trunc(df$mil /20000)
# then to get the mean by "mile bin":
aggregate(price ~ mil2,df,mean)
# or the number:
aggregate(price ~ mil2,df,length)
# or simply:
table(df$mil2)