让我们用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
的方法,让我们说gear
和carb
,使用相同的“模式”表示平均值即均值4的观测值和观测值的平均值6.在真实数据集中,有几列具有相同的数字集(2,0和1)。我将比较列的方法(在示例qsec
中)与观察2和0。
我试图查看tapply
,apply
,sapply
等函数。但是我坚持要求平均每个栏目的条件(立刻)。
答案 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
的每个级别cyl
,gear
和carb
分别是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]