В R как использовать «агрегат» или «по», когда присутствуют не все комбинации факторов? - PullRequest
4 голосов
/ 05 октября 2011

Вот небольшой пример, иллюстрирующий мои данные:

> df <- data.frame(subgroup=rep(paste("s",1:3, sep=""), times=3),
                   feature=c(rep("a",6), rep("b",3)),
                   var=rep(1:3, each=3),
                   data=c(rnorm(3,1), rnorm(3,2), rnorm(3,0)))
> df
  subgroup feature var        data
1       s1       a   1  1.53152620
2       s2       a   1  1.25476445
3       s3       a   1  1.04221040
4       s1       a   2  1.68913400
5       s2       a   2  1.48290273
6       s3       a   2  1.62871854
7       s1       b   3  0.05278296
8       s2       b   3 -0.66623654
9       s3       b   3 -1.40006454

Я хочу проверить сумму столбца «data» для каждой комбинации feature-var, присутствующей в моем наборе данных. Точнее, я хочу получить TRUE, если сумма больше 3, и FALSE в противном случае:

> result
  feature snp   res
1       a   1  TRUE
2       a   2  TRUE
3       b   3 FALSE

Я пытался использовать «агрегат» или «по», но не могу сделать так, чтобы они соответствовали моим потребностям. Любая идея? Заранее спасибо.

1 Ответ

3 голосов
/ 05 октября 2011

Один из подходов заключается в использовании функции plyr ddply для группировки по признаку и переменной. Вы можете использовать функцию summarize для создания нового data.frame со столбцом, который соответствует правилу, которое вы разработали.

library(plyr)
ddply(df, c("feature", "var"), summarize, res = ifelse(sum(data) > 3,TRUE, FALSE))

Результат:

  feature var   res
1       a   1  TRUE
2       a   2  TRUE
3       b   3 FALSE

Другой альтернативой является использование data.table, которое должно обеспечить некоторые преимущества в производительности:

library(data.table)
dt <- data.table(df)

dt[, ifelse(sum(data) > 3, TRUE, FALSE), by = c("feature", "var")]

     feature var    V1
[1,]       a   1  TRUE
[2,]       a   2  TRUE
[3,]       b   3 FALSE
...