2013-05-24 16 views
7

Ich bin neu auf R und ich habe eine Daten.frame, genannt "CT", enthält eine Spalte namens "ID" mit mehreren hundert verschiedenen Identifikationsnummern (das sind Patienten). Die meisten Zahlen erscheinen einmal, aber einige andere erscheinen zwei oder drei Mal (daher in verschiedenen Reihen). Im CT data.frame möchte ich eine neue Variable namens "countID" einfügen, die die Anzahl der Vorkommen dieser spezifischen Patienten angibt (mehrere Datensätze sollten noch mehrmals erscheinen). Ich habe versucht, zwei verschiedene Strategien nach dem Lesen dieses Forum: 1. Strategie:Zählen Vorkommen in Spalte und erstellen Variable in R

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

Aber das funktioniert nicht, bekomme ich nur einen Zähler. zweite Strategie: einen Datenrahmen mit zwei Spalten erstellen (eine ID ist, ist eine Zählung) und das Spiel dieses Datenrahmen mit 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 

Also das funktioniert gut, aber ich kann die beiden data.frames schmelzen: die Anzahl der Zeilen stimmt nicht zwischen "out" und "CT" überein (out hat natürlich weniger Zeilen). Vielleicht hat jemand eine elegante Lösung, um die Anzahl der Vorkommen direkt in der data.frame CT hinzuzufügen, oder die beiden data.frames korrekt zu vergleichen? Vielen Dank im Voraus, Denis

+0

+1 für für die Ansicht Eingang und erwarteten Ausgang, aber das nächste Zeit, die Sie posten, machen Sie Ihr Beispiel [** reproduzierbar **] (http://stackoverflow.com/q/5963269/1478381), indem Sie einige Daten einschließen. Willkommen in SO! –

Antwort

5

Sie fast da waren! rle wird sehr gut funktionieren, müssen Sie nur Ihren Tisch rle vor der Berechnung auf ID sortieren:

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

Vielen Dank, das funktioniert gut! - Ich werde versuchen, die Bearbeitung zu verbessern und beim nächsten Mal ein paar Beispieldaten aufzunehmen. Groß! – den

+2

Auch 'transform (CT, Count = ave (ID, ID, FUN = Länge))' –

2

Wenn Sie nicht das Bedürfnis verspürt Basis R zu verwenden, macht plyr diese Aufgabe einfach:

> 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

Vielen Dank, ich werde das auch versuchen. – den

3

data.table in der Regel die schnellste Weg bietet

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 
Verwandte Themen