表示r中多列的条件

时间:2018-06-14 21:47:55

标签: r aggregate mean tapply

让我们用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)

我想检查qsec关于cyl的方法,让我们说gearcarb,使用相同的“模式”表示平均值即均值4的观测值和观测值的平均值6.在真实数据集中,有几列具有相同的数字集(2,0和1)。我将比较列的方法(在示例qsec中)与观察2和0。

我试图查看tapplyapplysapply等函数。但是我坚持要求平均每个栏目的条件(立刻)。

希望我明白自己。 谢谢!

4 个答案:

答案 0 :(得分:3)

您正在寻找的功能是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列汇总所有列。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我理解的是,qsec的每个级别cylgearcarb分别是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

输出:

ANDROID_SDK_ROOT

答案 3 :(得分:0)

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]