2013-05-24 6 views
7

私はRで新しく、数百の異なる識別番号(患者である)を含む「ID」という列を含む「CT」というdata.frameを持っています。ほとんどの数値は一度表示されますが、他の数値は2〜3回表示されます(したがって、異なる行に表示されます)。 CT data.frameでは、「countID」という新しい変数を挿入したいと思います。これは、これらの特定の患者の出現回数を示します(複数のレコードが複数回表示されるはずです)。 第一の戦略: 私はこのフォーラムを読んだ後、二つの異なる戦略を試してみました列内の出現数をカウントして変数を作成する

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

しかし、このdoesntの仕事は、私は一つだけカウントを取得します。 第二の戦略:

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 

だから、これは正常に動作しますが、私は2 data.framesを溶かすカント:CTと、このデータフレームを(1カウントされ、1がIDです)2列を持つデータフレームを作成し、一致行数が "out"と "CT"の間で一致しません(outには行が少なくなります)。 誰かが、data.frame CTに直接出現回数を追加するか、2つのdata.framesを正しく一致させるための洗練されたソリューションがありますか?事前に おかげで、デニス

+0

1の方法が、次を提供しますあなたが投稿する時に、いくつかのデータを含めることによってあなたの例[** reproducible **](http://stackoverflow.com/q/5963269/1478381)を作成してください。ようこそ! –

答えて

5

あなたはほとんどありました! rleは非常にうまく動作しますが、あなただけのrleを計算する前にIDにあなたのテーブルをソートする必要があります。

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

ありがとう、これはうまく動作します! - 私は編集を改善し、次回にいくつかのサンプルデータを追加しようとします。すばらしいです! – den

+2

また、 'transform(CT、Count = ave(id、id、FUN = length))' –

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 
+0

ありがとう、私もこれを試してみます。 – den

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 
関連する問題