R 如何获得某一组下不同变量的多重统计?
我有三组不同的汽车(R 如何获得某一组下不同变量的多重统计?,r,R,我有三组不同的汽车(产地:1、2和3,分别是美国、欧洲和日本)。我还有多个变量,如mpg,displacement,马力,重量,以及加速度。我想写一个代码,在其中我可以得到这5个变量的平均值和标准偏差,仅适用于美国汽车(origin==1) 我使用的是tapply()命令,但它需要10个不同的条目,并且不能过滤掉2型和3型车 有什么想法吗?这里有一个例子,使用了mtcars数据集的修改子集,并添加了组列。从 > dat # mpg cyl disp
产地
:1、2和3,分别是美国、欧洲和日本)。我还有多个变量,如mpg
,displacement
,马力
,重量
,以及加速度
。我想写一个代码,在其中我可以得到这5个变量的平均值和标准偏差,仅适用于美国汽车(origin==1
)
我使用的是tapply()
命令,但它需要10个不同的条目,并且不能过滤掉2型和3型车
有什么想法吗?这里有一个例子,使用了
mtcars
数据集的修改子集,并添加了组
列。从
> 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
数据:
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")
dat使用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所建议的):
正如我上面的朋友一样,我将使用mtcars
数据集。它没有“原产国”变量,但我将使用cyl
,因为它还有三个级别。假设美国的汽车相当于4辆轿车
首先,让我们创建一个过滤数据集。最好只执行一次,而不是每次运行aggregate
:
american <- mtcars[mtcars$cyl == 4, ]
现在标准偏差:
aggregate(formula = cbind(mpg, hp, drat, wt, qsec) ~ cyl,
data = american,
FUN = sd)
希望能有所帮助。谢谢,这太棒了!!现在唯一的问题是一些变量有一些“NA”值,因此没有计算结果。我知道我可以用“na.rm=TRUE”。。。但它不起作用…我是R的新手,所以这实际上解决了我的很多疑问。非常感谢。我很高兴能帮上忙,欢迎来到R!这是一种很棒的语言。这也很有效,事实上,我被告知“colMeans”和“Apply”命令可以解决这个问题,但我仍然无法在code@rnso-您仍然可以按照我建议的方式将na.rm=TRUE
传递给sd
应用(数据,2,sd,na.rm=TRUE)
再次感谢您的提示。我正在编辑上面的答案。
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)