簡體   English   中英

r中多列的條件均值

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

我想檢查關於cylqsec ,並假設gearcarb ,其均值具有相同的“模式”,即具有4的觀測值的平均值和具有6的觀測值的平均值。在真實數據集中將有幾列具有相同的一組數字(2、0和1)。 我將列的均值(在示例qsec )與觀察值2和0進行比較。

我試圖看一下tapplyapplysapply類的功能。 但是我陷入了讓平均條件同時申請每一列的問題。

希望我能說清楚。 謝謝!

您正在尋找的功能是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針對cylgearcarb每個級別的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.

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