[英]Mean with condition for multiple columns in r
讓我們使用mtcars
來解釋這種情況。
對於多個列,我想做的與下面相同。 具有與另一列具有特定值(在下面的示例中為4和6)有關的qsec
列(在示例中)的平均值。 稍后我將比較結果,以便也許將結果存儲在向量中
table(mtcars$cyl)
4 6 8
11 7 14
mean(mtcars$qsec[mtcars$cyl == 4], na.rm = T)
mean(mtcars$qsec[mtcars$gear == 4], na.rm = T)
我想檢查關於cyl
的qsec
,並假設gear
和carb
,其均值具有相同的“模式”,即具有4的觀測值的平均值和具有6的觀測值的平均值。在真實數據集中將有幾列具有相同的一組數字(2、0和1)。 我將列的均值(在示例qsec
)與觀察值2和0進行比較。
我試圖看一下tapply
, apply
, sapply
類的功能。 但是我陷入了讓平均條件同時申請每一列的問題。
希望我能說清楚。 謝謝!
您正在尋找的功能是aggregate
:
aggregate(. ~ cyl, FUN=mean, data=mtcars[,c("cyl", "qsec", "gear", "carb")],
subset=cyl %in% c(4, 6)
)
cyl qsec gear carb
1 4 19.13727 4.090909 1.545455
2 6 17.97714 3.857143 3.428571
在上面的函數中, data=
是data.frame。 在這里,我們僅選擇了所需的列。 然后, subset=
指定要保留數據的哪幾行(在這種情況下,僅保留cyl 4和6)。
公式. ~ cyl
. ~ cyl
指示根據cyl
列匯總所有列。
On選項是使用dplyr::mutate_at
因為OP希望在多列上應用相同的功能。 解決方案將是:
library(dplyr)
mtcars %>%
group_by(cyl) %>%
summarise_at(vars(c("qsec", "gear", "carb")), funs(mean), na.rm = TRUE) %>%
filter(cyl!=8)
# # A tibble: 2 x 4
# cyl qsec gear carb
# <dbl> <dbl> <dbl> <dbl>
# 1 4.00 19.1 4.09 1.55
# 2 6.00 18.0 3.86 3.43
我了解您正在尋找的是qsec
針對cyl
, gear
和carb
每個級別的qsec
平均值,而不是組合使用。 這段代碼可以幫助您,但不能直接讓您選擇這些因素的特定水平。 如果您需要執行第二部分,我認為您應該可以對此進行調整,但是我不確定如何...
apply(mtcars[,c("cyl","gear","carb")], 2, function(x) {
aggregate(mtcars[,"qsec"],list(x),mean)
})
輸出:
$cyl
Group.1 x
1 4 19.13727
2 6 17.97714
3 8 16.77214
$gear
Group.1 x
1 3 17.692
2 4 18.965
3 5 15.640
$carb
Group.1 x
1 1 19.50714
2 2 18.18600
3 3 17.66667
4 4 16.96500
5 6 15.50000
6 8 14.60000
data.table
解決方案:
require(data.table)
mtcars[cyl %in% c(4, 6), .(mn_qsec = mean(qsec),
mn_gear = mean(gear),
mn_carb = mean(carb)),
by = cyl]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.