R: вычислить дисперсию для данных $ V1 для каждого отдельного значения в данных $ V2 - PullRequest
4 голосов
/ 25 августа 2011

у меня фрейм данных выглядит так

V1   V2
..   1
..   2
..   1
..   3

и т.д.

Для каждого отдельного значения V2 я хотел бы рассчитать дисперсию данных в V1. Я только начал свое приключение с R, какие-нибудь советы, как это сделать? для моего конкретного случая, я думаю, я могу сделать что-то вроде

вручную
 var1 = var(data[data$V2==1, "V1"])
 var2 = ...

и т. Д., Потому что я знаю все возможные значения V2 (их не так много), однако мне любопытно, что было бы более общими решениями. Есть идеи?

Ответы [ 4 ]

9 голосов
/ 25 августа 2011

И старый резерв, tapply:

dat <- data.frame(x = runif(50), y = rep(letters[1:5],each = 10))
tapply(dat$x,dat$y,FUN = var)

         a          b          c          d          e 
0.03907351 0.10197081 0.08036828 0.03075195 0.08289562 
7 голосов
/ 25 августа 2011

Другое решение, использующее data.table. Это намного быстрее, особенно полезно, когда у вас большие наборы данных.

require(data.table)
dat2 = data.table(dat)
ans  = dat2[,list(variance = var(V1)),'V2']
3 голосов
/ 25 августа 2011

Есть несколько способов сделать это, я предпочитаю:

dat <- data.frame(V1 = rnorm(50), V2=rep(1:5,10))
dat

aggregate (V1~V2, data=dat, var) # The first argument tells it to group V1 based on the values in V2, the last argument simply tells it the function to apply.

> aggregate (V1~V2, data=dat, var)
  V2        V1
1  1 0.9139360
2  2 1.6222236
3  3 1.2429743
4  4 1.1889356
5  5 0.7000294

Также посмотрите на ddply, daply и т. Д. В пакете plyr.

3 голосов
/ 25 августа 2011
library(reshape)
ddply(data, .(V2), summarise, variance=var(V1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...