计算R中的方差

时间:2014-02-06 12:46:04

标签: r variance

   unique.identifier zip.code household profession gender age value1   value2 value3 coupon
1               197386 47508827         4        low female  24  35.13    82.50   0.00      1
2               197386 47508827         4        low female  24  36.01    72.98   0.00      1
3               197386 47508827         4        low female  24  35.87    82.13   0.00      1
4               197386 47508827         4        low female  24  38.87    76.62   0.00      1
5               197386 47508827         4        low female  24  41.89     0.00   0.00      1
6               197388 17557326         2        low      m  38  26.81     0.00  29.98      1
7               197388 17557326         2        low      m  38  25.61     0.00   0.00      1
10              197392 22830028         2        low      m  33  25.66     0.00  19.99      1

我试图根据唯一标识符计算方差value1,value2,value3 喜欢35.13 82.5 36.01 72.89 35.87 82.13 38.87 76.62 41.89的方差,因为它们共享相同的unique.identifier

我应该使用什么代码?

3 个答案:

答案 0 :(得分:3)

您可以使用by

by(dat[c("value1", "value2", "value3")], dat$unique.identifier, FUN= sapply, var)


dat$unique.identifier: 197386
    value1     value2     value3 
   7.90708 1250.04828    0.00000 
----------------------------------------------------------- 
dat$unique.identifier: 197388
  value1   value2   value3 
  0.7200   0.0000 449.4002 
----------------------------------------------------------- 
dat$unique.identifier: 197392
value1 value2 value3 
    NA     NA     NA 

其中dat是数据框的名称。

答案 1 :(得分:3)

使用plyr

set.seed(1618)
dat <- data.frame(id = c(1,1,2,3,3,3,4,4,4,5),
                  x = rnorm(10),
                  y = runif(10))

library(plyr)
ddply(dat, .(id), summarise, var1 = var(x), var2 = var(y))

  id       var1        var2
1  1 0.06147503 0.009907597
2  2         NA          NA
3  3 2.18725353 0.097501569
4  4 0.52691906 0.009814862
5  5         NA          NA

答案 2 :(得分:1)

我的回答与斯文海恩斯坦的答案非常相似,但也许很容易理解。

为什么不subset根据unique.identifier然后var,所有基本功能:
首先,我读了你的数据

help <- read.table(text="   unique.identifier zip.code household profession gender age value1   value2 value3 coupon
1               197386 47508827         4        low female  24  35.13    82.50   0.00      1
2               197386 47508827         4        low female  24  36.01    72.98   0.00      1
3               197386 47508827         4        low female  24  35.87    82.13   0.00      1
4               197386 47508827         4        low female  24  38.87    76.62   0.00      1
5               197386 47508827         4        low female  24  41.89     0.00   0.00      1
6               197388 17557326         2        low      m  38  26.81     0.00  29.98      1
7               197388 17557326         2        low      m  38  25.61     0.00   0.00      1
10              197392 22830028         2        low      m  33  25.66     0.00  19.99      1", header=TRUE)

然后,子集可以使用相同的unique.identifier获得所需的子集,该子集可以更改为您想要的任何内容,:

help2 <- subset(help, unique.identifier=="197386")
unique.identifier zip.code household profession gender age value1 value2
1            197386 47508827         4        low female  24  35.13  82.50
2            197386 47508827         4        low female  24  36.01  72.98
3            197386 47508827         4        low female  24  35.87  82.13
4            197386 47508827         4        low female  24  38.87  76.62
5            197386 47508827         4        low female  24  41.89   0.00

最后是方差,只有所需的列(你也可以在那里设置名称:sapply(help2[,c("value1", "value2", "value3")], FUN=var)),

sapply(help2[,7:9], FUN=var)
    value1     value2     value3 
   7.90708 1250.04828    0.00000