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)