2013-04-18 31 views
6

Mam dwa zestawy danych, zawierające dane przed i po. Respondenci mają unikalne identyfikatory i chcę utworzyć podzbiór obejmujący tylko tych, którzy odpowiedzieli na oba ankiety. Przykład zbioru danych:Dopasowywanie identyfikatorów w dwóch zestawach danych

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) 

Mam następującą funkcję:

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) 

myślę, że musi być lepszy sposób niż ta funkcja robi to samo, ale nie mogę myśleć jak to zrobić. Jak to zrobiłem wydaje się trochę nieporządny. Mam na myśli, że działa - robi to, co chcę, ale nie mogę powstrzymać się od myślenia, że ​​istnieje lepszy sposób.

Moje przeprosiny, jeśli zostało to już zadane w podobny sposób, ale nie mogłem go znaleźć - w takim przypadku proszę zwrócić się do odpowiedniej odpowiedzi.

+5

Coś jak: 'all.data [all.data $ ID% w% przecinają (pre.data $ ID , post.data $ ID),] '? – Arun

Odpowiedz

4

Uwaga: Arun pisał tę samą odpowiedź w komentarzu nieco wcześniej niż ja.

Można użyć intersect takiego:

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

Co daje:

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

To jest dokładnie to, czego potrzebuję, dzięki! – Froom2

3

Zobacz, jak dołączyć do plyr.

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

Spowoduje to połączenie danych w poziomie, co w wielu aplikacjach będzie bardziej przydatne. –

+0

Mimo, że druga odpowiedź została zaakceptowana, działa to również dobrze - pozostawiając dane w szerokim formacie, które byłyby użyteczne w wielu miejscach, ale nie w odniesieniu do moich konkretnych potrzeb. Dziękuję Ci! – Froom2