2015-05-18 10 views
5

Podczas próby uzyskania danych nadających się do analizy, nie mogę zrobić tego poprawnie. Załóżmy, że mam zestawy danych w tej formie:Wyszukiwanie wspólnych wierszy w R

df1 

V1 V2df1 
a H 
b Y 
c Y 

df2 

V1 V2df2 
a Y 
j H 
b Y 

i kolejne trzy (łącznie 5 zestawów danych o różnych długościach). Co staram się zrobić, to następujące. Najpierw muszę znaleźć wszystkie wspólne elementy z pierwszej kolumny (V1) - w tym przypadku są to: a, b. Następnie, zgodnie z tymi wspólnymi elementami, próbuję utworzyć połączony zestaw danych, w którym wartości V1 będą wspólne dla wszystkich pięciu zestawów danych, a wartości z innych kolumn będą dołączane w tym samym wierszu. Tak, aby wyjaśnić na przykładzie, mój wynik powinien wyglądać mniej więcej tak:

V1 V2df1 V2df2 
a H  Y 
b Y  Y 

udało mi się dostać jakiś kod działa, ale apperently wyniki nie są poprawne. Co zrobiłem: przeczytać wszystkie wiersze z wszystkich plików do zmiennych (Przykład: a<-df1[,1] i tak dalej) i znaleźć wspólne wiersze jak:

red<-Reduce(intersect, list(a,b,c,d,e)) 

potem filtrowane konkretnych zestawów danych, takich jak:

df1 <- unique(filter(df1, V1 %in% red)) 

I zamówione każdy zestaw danych zgodnie z rzędu:

df1<-data.frame(df1[with(df1, order(V1)),]) 

i usunięte duplikaty (elementów w pierwszej kolumnie)

df1<- df1[unique(df1$V1),] 

Potem stworzył nowy zestaw danych z:

newdata<-data.frame(V1common=df1[,1], V2df1=df1[,2],V2df2=df2[,2]...) 

... znaczy dla wszystkich pięciu zestawów danych. Faktycznie uzyskałem taką samą liczbę wierszy (dobry znak, ponieważ liczba przecinków jest taka sama), a następnie dołączono inne posortowane kolumny, ale coś nie sumuje się. Dzięki za jakąkolwiek radę. (Pominąłem użycie bibliotek i tym podobne, kod służy jedynie celom ilustracyjnym).

+3

Zobacz '? Merge'. Myślę, że 'merge (df1, df2)' będzie tym, czego szukasz. – nicola

+0

Ogólnie rzecz biorąc, dobra praktyka, aby wspomnieć o bibliotekach, tak myślę. Tak jak osoby R mogą nie znać na przykład "filtru" (poza funkcją szeregu czasowego w bazie R). – Frank

+0

Rozwijanie idei nicolas, dla wielu zestawów danych, użyj 'Reduce' z' merge', tj. 'Reduce (function (...) merge (..., by = 'V1'), mget (paste0 ('df', 1 : 5))) ' – akrun

Odpowiedz

7

Można użyć join_all z plyr pakietu

require(plyr) 
df <- join_all(list(df1,df2,df3,df4, df5), by = 'V1', type = 'inner') 
+0

Dokładnie tego szukałem. Czy mogę dołączyć do niego również za pomocą więcej niż jednego kryterium? Na przykład V1 i V2, jeśli istnieją 3 kolumny? –

+0

Tak, możesz. Spróbuj użyć czegoś takiego jak by = c ("V1", "V2") – BICube

Powiązane problemy