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)

我想检查 qsec 关于 cyl 的方法,让我们说 gearcarb,同样的 "pattern"平均值,即观察值的平均值为 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= 指定要保留的数据行(在本例中仅保留第 4 和第 6 列)。

公式. ~ cyl表示根据cyl列汇总所有列。

选项是使用 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

据我所知,您要查找的是 cylgearcarb 的每个级别的 qsec 的平均值,而不是组合。这段代码让你明白了,但并不直接让你 select 这些因素的特定水平。如果您需要能够完成第二部分,我认为您应该能够对其进行调整以达到目的,但我不确定如何...

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]