![](/img/trans.png)
[英]Averaging two rows in a dataset, based on them having the same value in another column,
[英]averaging a column in a dataset based on value in another column
我有許多不同型號汽車的數據框。 每輛車都是一行,包括每輛特定車的品牌,型號和平均每日行駛里程。 我正在嘗試通過模型獲取平均每日里程。 我該怎么做? 實際的表具有許多不同的模型和模型,我不想將它們分解為單獨的數據框。 我確信我可以用R中的一個命令來完成它。謝謝您的幫助。
這是數據幀模型的子集。
假設您的數據如下所示:
"","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
這種問題(需要通過分組變量來計算)在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
我將研究執行聚合的一些不同方式: by
, aggregate
, lapply
和split
, tapply
, dplyr
和data.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
我們可以使用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
最后,我們可以使用performant data.table
包執行聚合。 語法起初可能看起來有些奇怪,但是我們基本上是在說:計算按組分組的平均值。
library(data.table)
setDT(dat)[,mean(value),group]
# group V1
# 1: a 0.05444944
# 2: c -0.04324673
# 3: b -0.16894993
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.