агрегировать по нескольким переменным в r - PullRequest
1 голос
/ 12 мая 2010

У меня довольно большой набор данных в длинном формате, где мне нужно подсчитать количество экземпляров идентификатора из-за двух разных переменных, A & B. Например. Один и тот же человек может быть представлен в нескольких строках из-за A или B. Что мне нужно сделать, это подсчитать количество экземпляров ID, что не слишком сложно, но также подсчитать количество ID из-за A и B и вернуть они как переменные в наборе данных.

С уважением,

// Mi

Ответы [ 3 ]

3 голосов
/ 12 мая 2010

Функция ddply() из пакета plyr позволяет разбивать данные на переменные идентификатора, выполнять функцию для каждого блока, а затем собирать их все вместе. Таким образом, вам нужно разбить ваши данные по идентификатору и статусу A / B, посчитать, сколько раз встречается каждая из этих комбинаций (используя nrow()), а затем аккуратно сложить эти значения.

Использование wkmor1's df:

library(plyr)

x <- ddply(.data = df, .var = c("ID", "GRP"), .fun = nrow)

, который возвращает:

  ID GRP V1
1  1   a  2
2  1   b  2
3  2   a  2
4  2   b  2

А затем объединить это с исходными данными:

merge(x, df, by = c("ID", "GRP"))
3 голосов
/ 12 мая 2010

ОК, учитывая интерпретации, которые я вижу, самое быстрое и простое решение ...

df$IDCount <- ave(df$ID, df$group, FUN = length)
0 голосов
/ 12 мая 2010

Вот один из подходов, использующих «таблицу» для подсчета строк, соответствующих вашим критериям, и «объединение» для добавления частот обратно во фрейм данных.

> df<-data.frame(ID=rep(c(1,2),4),GRP=rep(c("a","a","b","b"),2))
> id.frq <- as.data.frame(table(df$ID))
> colnames(id.frq) <- c('ID','ID.FREQ')
> df <- merge(df,id.frq)
> grp.frq <- as.data.frame(table(df$ID,df$GRP))
> colnames(grp.frq) <- c('ID','GRP','GRP.FREQ')
> df <- merge(df,grp.frq)
> df
  ID GRP ID.FREQ GRP.FREQ
1  1   a       4        2
2  1   a       4        2
3  1   b       4        2
4  1   b       4        2
5  2   a       4        2
6  2   a       4        2
7  2   b       4        2
8  2   b       4        2
...