计算列中的出现次数并在R中创建变量

时间:2013-05-24 13:31:06

标签: r count

我是R的新手,我有一个名为“CT”的data.frame,其中包含一个名为“ID”的列,其中包含数百个不同的标识号(这些是患者)。大多数数字出现一次,但有些出现两次或三次(因此,在不同的行中)。 在CT data.frame中,我想插入一个名为“countID”的新变量,该变量将指示这些特定患者的出现次数(多个记录应该仍然出现几次)。 在阅读本论坛后,我尝试了两种不同的策略: 第一战略:

CT <- cbind(CT, countID=sequence(rle(CT.long$ID)$lengths)

但这不起作用,我只得到一个计数。 第二个策略:创建一个包含两列的数据框(一个是ID,一个是计数),这个数据框与CT匹配:

tabs <- table(CT.long$ID)
out <- data.frame(item=names(unlist(tabs)),count=unlist(tabs)[],stringsAsFactors=FALSE)
rownames(out) = c()
head(out)

# item    count
# 1 1.312     1
# 2 1.313     2
# 3 1.316     1
# 4 1.317     1
# 5 1.321     1
# 6 1.322     1

所以这个工作正常,但我不能融化两个data.frames:“out”和“CT”之间的行数不匹配(当然,行数较少)。 也许某人有一个优雅的解决方案,可以直接在data.frame CT中添加出现次数,或者正确匹配两个data.frames? 提前谢谢,丹尼斯

3 个答案:

答案 0 :(得分:5)

你快到了! rle可以很好地运行,您只需要在计算ID之前在rle上对表进行排序:

CT <- data.frame( value = runif(10) , id = sample(5,10,repl=T) )

#  sort on ID when calculating rle
Count <- rle( sort( CT$id ) )

#  match values
CT$Count <- Count[[1]][ match( CT$id , Count[[2]] ) ]
CT
#       value id Count
#1  0.94282600  1     4
#2  0.12170165  2     2
#3  0.04143461  1     4
#4  0.76334609  3     2
#5  0.87320740  4     1
#6  0.89766749  1     4
#7  0.16539820  1     4
#8  0.98521044  5     1
#9  0.70609853  3     2
#10 0.75134208  2     2

答案 1 :(得分:3)

data.table通常提供最快捷的方式

set.seed(3)
library(data.table)
ct <- data.table(id=sample(1:10,15,replace=TRUE),item=round(rnorm(15),3))
st <- ct[,countid:=.N,by=id]
 id   item countid
 1:  2  0.953       2
 2:  9  0.535       2
 3:  4 -0.584       2
 4:  4 -2.161       2
 5:  7 -1.320       3
 6:  7  0.810       3
 7:  2  1.342       2
 8:  3  0.693       1
 9:  6 -0.323       5
10:  7 -0.117       3
11:  6 -0.423       5
12:  6 -0.835       5
13:  6 -0.815       5
14:  6  0.794       5
15:  9  0.178       2

答案 2 :(得分:2)

如果您觉得不需要使用基础R,则plyr可以轻松完成此任务:

> set.seed(3)
> library(plyr)
> ct <- data.frame(id=sample(1:10,15,replace=TRUE),item=round(rnorm(15),3))
> ct <- ddply(ct,.(id),transform,idcount=length(id))
> head(ct)
  id   item idcount
1  2  0.953       2
2  2  1.342       2
3  3  0.693       1
4  4 -0.584       2
5  4 -2.161       2
6  6 -0.323       5