2013-04-18 11 views
6

Ho due serie di dati, compresi dati pre e post. Gli intervistati hanno ID univoci e voglio creare un sottoinsieme che includa solo quelli che hanno risposto a entrambi i sondaggi. Esempio set di dati:ID corrispondenti in due dataset

pre.data <- data.frame(ID = c(1:10), Y = sample(c("yes", "no"), 10, replace = TRUE), 
    Survey = 1) 

post.data <- data.frame(ID = c(1:3,6:10), Y = sample(c("yes", "no"), 8, replace = TRUE), 
    Survey = 2) 

all.data <- rbind(pre.data, post.data) 

Ho la seguente funzione:

match <- function(dat1, dat2, dat3){ #dat1 is whole dataset(both stitched together) 
    #dat2 is pre dataset #dat3 is post dataset 
    selectedRows <- (dat1$ID %in% dat2$ID & 
        dat1$ID %in% dat3$ID) 

    matchdata <- dat1[selectedRows,] 
    return(matchdata) 
} 

prepost.match.data <- match(all.data, pre.data, post.data) 

Penso che ci deve essere un modo migliore di questa funzione di fare la stessa cosa, ma non riesco a pensare a come. Come ho fatto sembra un po 'complicato. Voglio dire, funziona, fa quello che voglio, ma non posso fare a meno di pensare che c'è un modo migliore.

Le mie scuse se questo è già stato chiesto in modo simile ma non sono stato in grado di trovarlo - in tal caso, per favore, indicarmi una risposta pertinente.

+5

Qualcosa di simile: 'all.data [all.data $ ID% in% intersecano (pre.data $ ID , post.data $ ID,] '? – Arun

risposta

4

Nota: Arun postato la stessa risposta in un commento un po 'prima di me.

È possibile utilizzare intersect come questo:

all.data[all.data$ID %in% intersect(pre.data$ID, post.data$ID),] 

che dà:

ID Y Survey 
1 1 yes  1 
2 2 no  1 
3 3 no  1 
6 6 yes  1 
7 7 yes  1 
8 8 yes  1 
9 9 no  1 
10 10 yes  1 
11 1 no  2 
12 2 yes  2 
13 3 no  2 
14 6 no  2 
15 7 yes  2 
16 8 yes  2 
17 9 no  2 
18 10 yes  2 
+0

Questo è esattamente ciò di cui ho bisogno, grazie! – Froom2

3

Guardare unirsi in plyr.

prepost.match.data <- join(pre.data, post.data, by = c("ID")) 
+0

Unirà i dati orizzontalmente, che in molte applicazioni saranno più utili. –

+0

Anche se ho inserito l'altra risposta come accettata, anche questa funziona bene - lasciando i dati in formato ampio, che sarebbero davvero utili in molti posti ma non per le mie esigenze specifiche. Grazie! – Froom2

Problemi correlati