如何获取某一组下不同变量的多重统计?

时间:2014-09-14 20:57:39

标签: r

我有3组不同的汽车(origin:1,2和3,分别是美国,欧洲和日本)。我还有多个变量,例如mpgdisplacementhorsepowerweightacceleration。我想写一个代码,我只能为美国汽车(origin == 1)得到这5个变量的均值和标准差。

我正在使用tapply()命令,但这需要10个不同的条目,并且它不会过滤掉2型和3型汽车。

有什么想法吗?

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 

如果您只想计算几列,请按组和列进行子集(此处我使用mpghpwt),然后使用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)

希望有所帮助。