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
的方法,让我们说 gear
和 carb
,同样的 "pattern"平均值,即观察值的平均值为 4,观察值的平均值为 6。在真实的数据集中,将有几列具有相同的数字集(2、0 和 1)。我将比较列的均值(在示例 qsec
中)与观察值 2 和 0.
我尝试查看 tapply
、apply
、sapply
等函数。但是我一直坚持在平均条件下(一次)申请每一列。
希望我说清楚了。
谢谢!
您要找的函数是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
据我所知,您要查找的是 cyl
、gear
和 carb
的每个级别的 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]
让我们用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
的方法,让我们说 gear
和 carb
,同样的 "pattern"平均值,即观察值的平均值为 4,观察值的平均值为 6。在真实的数据集中,将有几列具有相同的数字集(2、0 和 1)。我将比较列的均值(在示例 qsec
中)与观察值 2 和 0.
我尝试查看 tapply
、apply
、sapply
等函数。但是我一直坚持在平均条件下(一次)申请每一列。
希望我说清楚了。 谢谢!
您要找的函数是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
据我所知,您要查找的是 cyl
、gear
和 carb
的每个级别的 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]