【问题标题】:Is there a quick way to get the mean of various "bins" of a column in a dataframe?有没有一种快速的方法来获取数据框中列的各种“箱”的平均值?
【发布时间】:2013-04-17 06:09:10
【问题描述】:

如果此问题已得到解答,我深表歉意 - 我只是找不到它!为简化起见,我有一个包含 2 个相关列的汽车数据框:里程和价格。我想计算 0-20,000 英里、20,000-40,000 英里等的平均价格和汽车数量(以 20,000 英里“箱子”为单位)。我一直在为各种里程范围制作数据子集,然后查看该子集的平均值和数量或车辆。我想知道是否有更有效的方法来做到这一点,而不是制作所有这些子集——我用各种“箱”和数据做了很多次。我很想学习一种更巧妙的方法。

谢谢!!

【问题讨论】:

标签: r


【解决方案1】:

您可能希望按照以下方式进行:

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

【讨论】:

  • cut 在这里更有意义! (+1)。
  • 谢谢!太棒了!我喜欢扩展我的 R 知识,而不是暴力破解它。感谢您抽出宝贵时间。
【解决方案2】:

这显示了如何使用聚合在一次运行中按类别返回多个统计信息。

 # 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

【讨论】:

  • 如果您同时想要长度和平均值,与我的答案相比,这是一个改进:)。
  • 如果你想使用aggregate.formula,那么你的函数仍然可以是function(x) c(mean=mean(x), length=length(x) )
【解决方案3】:

要制作垃圾箱,请“切”。示例:

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 的平均值。

【讨论】:

    【解决方案4】:

    另一种使用聚合的方法:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 2021-01-24
      • 1970-01-01
      • 2021-04-25
      • 2021-05-02
      • 1970-01-01
      • 2010-10-09
      • 2020-11-20
      相关资源
      最近更新 更多