我是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? 提前谢谢,丹尼斯
答案 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