根据另一列中的值平均数据集中的列

时间:2017-04-30 19:04:29

标签: r dataframe average

我有许多不同型号的汽车车队的数据框。每辆车都是一排,包括每辆特定车辆的品牌,型号和平均每日里程。我试图通过模型获得平均每日里程数。我该怎么办?实际的表有许多不同的模型和制作,我不想将它们分成单独的数据帧。我相信我可以在R中使用一个命令来做到这一点。提前感谢您的帮助。

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

2 个答案:

答案 0 :(得分:0)

假设您的数据类似于:

"","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

答案 1 :(得分:0)

这种类型的问题(需要通过分组变量计算某些东西)会在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

聚合示例

我将介绍执行汇总的一些不同方式:byaggregatelapplysplittapply,{{ 3}}和dplyr

要使用by函数,我们传入一些data,并为其提供我们想要分组的变量,然后我们传递我们想要应用的函数,然后使用{{1}以表格形式获取它。

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 split首先按分组变量分隔数据,然后对分隔的列表执行计算。我们使用lapply将结果放在表格形式中。

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符号是管道 - 它们非常有用。

%>%

最后,我们可以使用高性能 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