【问题标题】:averaging a column in a dataset based on value in another column根据另一列中的值对数据集中的列进行平均
【发布时间】:2017-04-30 19:04:28
【问题描述】:

我有一个包含许多不同型号汽车的数据框。每辆车都是一行,包括每辆特定车辆的品牌、型号和平均每日行驶里程。我正在尝试按型号获取平均每日里程。我该怎么做?实际的表格有许多不同的模型和品牌,我不想将它们分成单独的数据框。我确信我可以使用 R 中的一个命令来完成。提前感谢您的帮助。

这是数据框的一个子集 制作模型 mi_per_day 现代雅绅特 43 现代雅绅特 37 现代创世纪 32 现代创世纪 63 本田雅阁 24 本田雅阁 54 本田思域 71 本田思域 16 丰田凯美瑞 61 丰田凯美瑞 27 丰田凯美瑞 12

【问题讨论】:

  • 您好,您能提供一些示例数据或可重现的示例吗?
  • aggregate 函数可能有用

标签: r dataframe average


【解决方案1】:

假设您的数据如下所示:

"","make","model","mi_per_day"
"1","Hyundai ","Accent",43
"2","Hyundai ","Genesis",32
"3","Hyundai ","Genesis",63
"4","Honda","Accord",24
"5","Honda","Accord",54
"6","Honda","Civic",71
"7","Honda","Civic",16
"8","Toyota","Camry",61
"9","Toyota","Camry",27
"10","Toyota","Camry",12

您可以使用以下代码进行编码:

read.csv("/path/to/csv/dir/cars.csv")
aggregate(x = cars$mi_per_day,by=list(cars$make),FUN=mean)

这给出了以下输出:

Group.1        x
1  Accent 43.00000
2  Accord 39.00000
3   Camry 33.33333
4   Civic 43.50000
5 Genesis 47.50000

【讨论】:

  • Bouncyball 和 hhh 谢谢你的回复,Bouncyball 你的回答太棒了
【解决方案2】:

这种类型的问题(需要通过分组变量计算)在 StackOverflow 上被问了很多。我决定展示几种不同的方法来获得(几乎)相同的结果。

数据

首先我生成了一些简单的数据:

set.seed(123)

dat <- data.frame(group = sample(c('a','b','c'), 100, T),
                  value = rnorm(100),
                  stringsAsFactors = FALSE)
head(dat) 

#   group       value
# 1     a  0.25331851
# 2     c -0.02854676
# 3     b -0.04287046
# 4     c  1.36860228
# 5     c -0.22577099
# 6     a  1.51647060

聚合示例

我将介绍一些执行聚合的不同方法:byaggregatelapplysplittapplydplyrdata.table

要使用by函数,我们传入一些data,并给它我们想要分组的变量,然后我们传递我们想要应用的函数,然后我使用stack在表格中获取它表格。

stack(by(dat, dat$group, function(d) mean(d$value)))

#        values ind
# 1  0.05444944   a
# 2 -0.16894993   b
# 3 -0.04324673   c

要使用aggregate 函数,我们可以使用公式语法,并给它我们的数据和我们想要的函数。我非常喜欢aggregate

aggregate(value ~ group, data = dat, mean)

#   group       value
# 1     a  0.05444944
# 2     b -0.16894993
# 3     c -0.04324673

我们可以使用splitlapply先通过我们的分组变量将数据分开,然后对分开的列表进行计算。我们使用stack 将结果以表格形式呈现。

stack(lapply(split(dat, dat$group), function(d) mean(d$value)))

#        values ind
# 1  0.05444944   a
# 2 -0.16894993   b
# 3 -0.04324673   c

我们可以使用tapply 函数将函数应用于不规则数组。我们给它我们想要用于计算的变量、我们的分组变量和我们的函数。我们使用stack 将结果以表格形式呈现。

stack(tapply(dat$value, dat$group, mean))

#        values ind
# 1  0.05444944   a
# 2 -0.16894993   b
# 3 -0.04324673   c

我们也可以使用出色的 dplyr 包来执行聚合。我们首先使用group_by 对数据进行分组,然后使用summarise 应用我们的函数。 %&gt;% 符号是管道 - 它们非常有用。

library(dplyr)
dat %>%
  group_by(group) %>%
  summarise(mean(value))

#   group `mean(value)`
#   <chr>         <dbl>
# 1     a    0.05444944
# 2     b   -0.16894993
# 3     c   -0.04324673

最后,我们可以使用高性能的data.table包来执行聚合。语法起初可能看起来有点奇怪,但我们基本上是在说:计算按组分组的平均值。

library(data.table)
setDT(dat)[,mean(value),group]

#    group          V1
# 1:     a  0.05444944
# 2:     c -0.04324673
# 3:     b -0.16894993

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    相关资源
    最近更新 更多