7

私はRで初めてで、数百の異なる識別番号(これらは患者です)を含む「ID」と呼ばれる列を含む「CT」と呼ばれる data.frame を持っています。ほとんどの数値は 1 回表示されますが、一部の数値は 2 回または 3 回表示されます (したがって、異なる行に表示されます)。CT data.frame に、これらの特定の患者の発生回数を示す「countID」という新しい変数を挿入したいと思います (複数のレコードが数回表示されるはずです)。このフォーラムを読んだ後、2 つの異なる戦略を試しました。

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

しかし、これは機能しません。カウントは 1 つしかありません。2 番目の戦略: 2 つの列 (1 つは ID、もう 1 つはカウント) を持つデータ フレームを作成し、このデータ フレームを 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

したがって、これは正常に機能しますが、2 つの data.frames を溶かすことはできません。「out」と「CT」の間で行数が一致しません (もちろん、out の行数は少なくなります)。誰かがdata.frame CTに直接出現回数を追加するか、2つのdata.frameを正しく一致させるエレガントなソリューションを持っているのでしょうか?

4

3 に答える 3

6

あなたはほとんどそこにいました!計算する前にrleテーブルをソートするだけで済みます:IDrle

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
于 2013-05-24T13:57:21.787 に答える