2013-05-24 31 views
7

sayısında değişiklik yaratıyorum R'de yeniyim ve birkaç yüzlerce farklı kimlik numarası içeren "ID" adlı bir sütun içeren "CT" adı verilen bir data.frame'im var (bunlar hastalardır). Çoğu sayı bir kez görünür, ancak bazı diğerleri iki veya üç kez (bu nedenle, farklı satırlarda) görünür. CT data.frame'de, "countID" olarak adlandırılan yeni bir değişken eklemek istiyorum. Bu, bu belirli hastaların meydana gelme sayısını gösterecektir (çoklu kayıtlar birkaç kez görünmelidir). 1 stratejisi:: Ben bu forumu okuduktan sonra iki farklı stratejiler çalıştıSütundaki sayımların meydana gelmesi ve R

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

Ama bu işe yaramazsa, ben sadece bir sayımı. 2 stratejisi:

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 

Yani bu düzgün çalıştığı ama iki data.frames eritmek olamaz: CT ile bu dataframe (tek sayısıdır, tek kimliğidir) iki sütunlu bir veri çerçevesi oluşturmak ve maç Satır sayısı "out" ve "CT" arasında eşleşmiyor (dışarıda daha az satır var). Belki biri veri örnekleme CT'de doğrudan olay sayısını eklemek veya iki data.frames ile eşleştirmek için şık bir çözüm olabilir? peşin sayesinde, Denis sen baz R kullanma ihtiyacı hissediyorum yoksa

+0

+1, ancak sonraki sağlar Gönderdiğiniz zaman, bazı verileri ekleyerek örneğinizi [** yeniden üretilebilir **] (http://stackoverflow.com/q/5963269/1478381) yapın. SO'ya hoşgeldiniz! –

cevap

5

Neredeyse vardı! rlerle hesaplamadan önce sadece ID üzerinde tablo sıralamak gerekir, çok güzel çalışacaktır:

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

Çok teşekkür ederim, bu iyi çalışıyor! - Düzenlemeyi iyileştirmeye çalışacağım ve bir dahaki sefere örnek verilere yer vereceğim. Harika! – den

+2

Ayrıca dönüştürme (CT, Say = ave (id, id, FUN = uzunluk)) ' –

2

, plyr kolay bu görevi yapar:

> 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

Çok teşekkür ederim, bunu da deneyeceğim. – den

3

data.table genellikle hızlı yol giriş ve beklenen çıkışı gösteren için

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 
İlgili konular