我有3组不同的汽车(origin
:1,2和3,分别是美国,欧洲和日本)。我还有多个变量,例如mpg
,displacement
,horsepower
,weight
和acceleration
。我想写一个代码,我只能为美国汽车(origin == 1
)得到这5个变量的均值和标准差。
我正在使用tapply()
命令,但这需要10个不同的条目,并且它不会过滤掉2型和3型汽车。
有什么想法吗?
答案 0 :(得分:1)
以下是使用添加了mtcars
列的group
数据集的修改子集的示例。从
> dat
# mpg cyl disp hp drat wt qsec vs am gear carb group
# Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 1
# Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 1
# Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 2
# Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 2
# Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 3
# Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 3
要计算第1组中汽车所有列的平均值和标准差,您可以将sapply
与匿名函数一起使用:
> sapply(dat[dat$group == 1, -length(dat)], function(x) {
c(mean = mean(x, na.rm = TRUE), sd = sd(x, na.rm = TRUE))
})
# mpg cyl disp hp drat wt qsec vs am gear carb
# mean 21 6 160 110 3.9 2.7475000 16.7400000 0 1 4 4
# sd 0 0 0 0 0.0 0.1803122 0.3959798 0 0 0 0
如果您只想计算几列,请按组和列进行子集(此处我使用mpg
,hp
和wt
),然后使用sapply
,如上所示
> d <- dat[dat$group == 1, c("mpg", "hp", "wt")]
> sapply(d, function(x) {
c(mean = mean(x, na.rm = TRUE), sd = sd(x, na.rm = TRUE))
})
# mpg hp wt
# mean 21 110 2.7475000
# sd 0 0 0.1803122
或者,您可以使用我编写的easyStats
函数并获得一些更简单的统计信息。
> easyStats <- function(x, digits = 3L, ...)
{
stopifnot(as.logical(length(x)), is.vector(x), is.numeric(x))
funs <- c("mean", "median", "sd", "max", "min")
mp <- mapply(function(f, ...) match.fun(f)(x, ...), funs, ...)
round(mp, digits = digits)
}
> sapply(dat[dat$group == 1, -length(dat)], easyStats, na.rm = TRUE)
# mpg cyl disp hp drat wt qsec vs am gear carb
# mean 21 6 160 110 3.9 2.748 16.740 0 1 4 4
# median 21 6 160 110 3.9 2.748 16.740 0 1 4 4
# sd 0 0 0 0 0.0 0.180 0.396 0 0 0 0
# max 21 6 160 110 3.9 2.875 17.020 0 1 4 4
# min 21 6 160 110 3.9 2.620 16.460 0 1 4 4
数据:强>
dat <-
structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1), cyl = c(6,
6, 4, 6, 8, 6), disp = c(160, 160, 108, 258, 360, 225), hp = c(110,
110, 93, 110, 175, 105), drat = c(3.9, 3.9, 3.85, 3.08, 3.15,
2.76), wt = c(2.62, 2.875, 2.32, 3.215, 3.44, 3.46), qsec = c(16.46,
17.02, 18.61, 19.44, 17.02, 20.22), vs = c(0, 0, 1, 1, 0, 1),
am = c(1, 1, 1, 0, 0, 0), gear = c(4, 4, 4, 3, 3, 3), carb = c(4,
4, 1, 1, 2, 1), group = c(1, 1, 2, 2, 3, 3)), .Names = c("mpg",
"cyl", "disp", "hp", "drat", "wt", "qsec", "vs", "am", "gear",
"carb", "group"), row.names = c("Mazda RX4", "Mazda RX4 Wag",
"Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Valiant"
), class = "data.frame")
答案 1 :(得分:0)
将mtcars用作数据和齿轮作为组:
> colMeans(mtcars[mtcars$gear==3,], na.rm=T)
mpg cyl disp hp drat wt qsec vs am gear carb
16.106667 7.466667 326.300000 176.133333 3.132667 3.892600 17.692000 0.200000 0.000000 3.000000 2.666667
>
> apply(mtcars[mtcars$gear==3,], 2, function(x)sd(x,na.rm=T))
mpg cyl disp hp drat wt qsec vs am gear carb
3.3716182 1.1872337 94.8527355 47.6892720 0.2736647 0.8329929 1.3499164 0.4140393 0.0000000 0.0000000 1.1751393
可以简化为(正如Richard Scriven所建议的那样):
> apply(mtcars[mtcars$gear==3,], 2, sd, na.rm=T)
mpg cyl disp hp drat wt qsec vs am gear carb
3.3716182 1.1872337 94.8527355 47.6892720 0.2736647 0.8329929 1.3499164 0.4140393 0.0000000 0.0000000 1.1751393
答案 2 :(得分:0)
作为我上面的朋友,我将使用mtcars
数据集。它没有&#34;原产国&#34;变量,但我会使用cyl
代替,因为它也有三个级别。比如说美国汽车与4名汽车制造商相当。
首先,让我们创建一个过滤的数据集。最好这样做一次,而不是每次运行aggregate
时R重新过滤原始数据集:
american <- mtcars[mtcars$cyl == 4, ]
现在,让我们首先计算几个变量的平均值:
aggregate(formula = cbind(mpg, hp, drat, wt, qsec) ~ cyl,
data = american,
FUN = mean)
现在是标准偏差:
aggregate(formula = cbind(mpg, hp, drat, wt, qsec) ~ cyl,
data = american,
FUN = sd)
希望有所帮助。