在R中为多列设置条件的平均值

3

让我们使用 mtcars 来解释这种情况。

我想要做的是针对多列重复执行以下操作。获取一个列qsec(在本例中)关于具有特定值的另一列的平均值(例如4和6)。稍后将进行结果比较,因此可能需要将结果存储在向量中。

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方法,并且让我们说gearcarb,采用相同的“模式”来观察平均值,即具有4个观察值和6个观察值的平均值。在真实数据集中,将有几列具有相同的数字集合(2、0和1)。我将比较一列(例如qsec)的2和0观察值的平均值。
我尝试查看tapplyapplysapply这样的函数。但我卡在了每一列都应用平均值条件的情况下。
希望我表达清楚了。 谢谢!

所以,澄清一下,您想知道如何找到 qsecgearcarb 的平均值,其中 cyl 等于 46 - phalteman
嗨@phalteman,我的要求是当gearcarbcyl这些列的观测值为4时,计算它们的qsec均值。因此,当gear的观测值等于4时,计算qsec的平均值。然后,再计算gear为4时qsec的平均值,以此类推...适用于多个列。 - ivan lange
4个回答

5
您要查找的函数是 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=表示数据框。在此,我们只选择了所需的列。而subset=指定要保留哪些数据行(在本例中仅为cyl 4和6)。
公式. ~ cyl指示根据列对所有列进行汇总。

1
在子集中,只需使用 cyl 而不是 mtcars$cyl - Onyambu
谢谢你的回答。我想要的正是这个,但是希望能够一次性对多列进行操作,像这样: aggregate(. ~ cyl, FUN=mean, data=mtcars[,c("cyl", "qsec")], subset=cyl %in% c(4, 6) ) 首先按照 cyl 进行操作,然后按照 gear 进行操作,以此类推... aggregate(. ~ gear, FUN=mean, data=mtcars[,c("gear", "qsec")], subset=gear %in% c(4, 6) ) 你有没有想过如何将此函数应用于更多的列?我有几列需要处理,如果能够找到一种自动化的方法来实现这一点,那就太好了。 - ivan lange

1
一种使用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]

完美解决方案 - rane

0
一种选择是使用 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

0
我理解你想要的是每个 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接