1

我有一个相当大的长格式数据集,由于两个不同的变量 A 和 BEg,我需要计算 ID 的实例数 由于 A 或 B,同一个人可以在多行中表示。我需要什么要做的就是计算 ID 的实例数,这并不难,但还要计算由于 A 和 B 产生的 ID 的数量,并将它们作为变量返回数据集中。

问候,

//咪

4

3 回答 3

3

包中的ddply()函数plyr允许您通过标识符变量将数据分开,对每个块执行一个函数,然后将它们全部组合在一起。因此,您需要按标识符和 A/B 状态将数据分开,计算每种组合出现的次数(使用nrow()),然后将这些计数很好地组合在一起。

使用 wkmor1 的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"))
于 2010-05-11T22:44:09.207 回答
3

好的,鉴于我看到的解释,那么最快和最简单的解决方案是......

df$IDCount <- ave(df$ID, df$group, FUN = length)
于 2010-05-11T22:48:31.443 回答
1

这是一种方法,使用“表”来计算满足您条件的行,并使用“合并”将频率添加回数据框。

> 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
于 2010-05-11T22:37:45.903 回答