我有一个相当大的长格式数据集,我需要根据两个不同的变量来计算ID的实例数量,A& B.例如由于A或B,同一个人可以在多行中表示。我需要做的是计算不太难的ID实例的数量,还要计算由于A和B而返回的ID的数量并返回这些作为数据集中的变量。
此致
//祢
答案 0 :(得分: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"))
答案 1 :(得分:3)
好的,鉴于我看到的解释,那么最快最简单的解决方案就是......
df$IDCount <- ave(df$ID, df$group, FUN = length)
答案 2 :(得分:0)
这是一种方法,使用'table'计算符合条件的行,并'merge'将频率添加回数据框。
> 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