簡體   English   中英

根據另一列中的值對數據集中的一列取平均值

[英]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

匯總示例

我將研究執行聚合的一些不同方式: 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 %>%符號是管道-它們非常有用。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM