2013-05-24 10 views
7

Sono nuovo su R e ho un data.frame, chiamato "CT", contenente una colonna denominata "ID" contenente diverse centinaia di numeri di identificazione diversi (questi sono pazienti). La maggior parte dei numeri appare una volta, ma alcuni altri appaiono due o tre volte (quindi, in file diverse). In CT data.frame, vorrei inserire una nuova variabile, chiamata "countID", che indicherebbe il numero di occorrenze di questi specifici pazienti (più record dovrebbero apparire ancora diverse volte). Ho provato due diverse strategie dopo aver letto questo forum: 1 ° strategia:conteggio delle occorrenze nella colonna e creazione della variabile in R

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

Ma questo non funziona, ottengo solo un conteggio. seconda strategia: creare una cornice di dati con due colonne (una è ID, uno è il conto) e la partita questa dataframe con 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 

Quindi questo funziona bene, ma i cant sciogliere i due data.frames: il il numero di file non corrisponde tra "out" e "CT" (l'out ha meno righe ovviamente). Forse qualcuno ha una soluzione elegante per aggiungere direttamente il numero di occorrenze nel file CT di data.frame o correttamente i due data.frames? Grazie in anticipo, Denis

+0

+1 per per mostrare input e l'output previsto, ma la prossima tempo di pubblicazione, fai il tuo esempio [** riproducibile **] (http://stackoverflow.com/q/5963269/1478381) includendo alcuni dati. benvenuti a SO! –

risposta

5

Si erano quasi! rle funzionerà molto bene, non vi resta che ordinare la tabella a ID prima di calcolare 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

Grazie mille, funziona perfettamente! - Proverò a migliorare la modifica e includerò alcuni dati di esempio la prossima volta. Grande! – den

+2

Anche 'transform (CT, Count = ave (id, id, FUN = lunghezza))' –

2

Se non si sente il bisogno di usare di base R, plyr rende questo compito facile:

> 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

Grazie mille, ci proverò anche io. – den

3

data.table di solito fornisce il modo più rapido

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 
Problemi correlati