2012-09-11 15 views
10

ten powinien być prosty jestem chyba po prostu głupie, ale ... muszę połączyć dwie ramki danych przez nazw rzędów DF1 i kolumny w df2 tjseryjnej przez row.name i kolumny

df1<-data.frame(x=1:3,y=4:6) 
rownames(df1)<-c("a","b","c") 
df1 
    x y 
a 1 4 
b 2 5 
c 3 6 

df2<-data.frame(site=c("a","b"),p=5:6,q=10:11) 
df2 
    site p q 
    a 5 10 
    b 6 11 

Przejęcie powinna produkować:

df3<-data.frame(site=c("a","b"),p=5:6,q=10:11,x=1:2,y=4:5) 
df3 
    site p q x y 
    a 5 10 1 4 
    b 6 11 2 5 

próbowałem

merge(df1,df2,by.x=row.names(df1),by.y=df2$site) 

ale pojawia się błąd

Błąd w fix.by (by.x, x): 'za' musi jednoznacznie określić poprawną kolumnę (-y)

Co robię źle?

+4

Dlaczego nie po prostu zrobić 'DF1 $ witryny <- row.names (DF1)' przed scaleniem? Komunikat o błędzie jest dość wyraźny. – Roland

Odpowiedz

11

Oto jedna opcja:

merge(df1, df2, by.x = "row.names", by.y = "site") 
    Row.names x y p q 
1   a 1 4 5 10 
2   b 2 5 6 11 
+1

Rozumiem. Nazwałem błędnie kolumny i nazwy wiersza! Dzięki – Elizabeth

+0

@ Eliseabeth, FYI, właśnie zrozumiałem, że przełączenie 'df1' i' df2' ('merge (df2, df1, by.x =" site ", by.y =" row.names ")') spowoduje a "data.frame", gdzie pierwsza kolumna nosi nazwę "site". Przypuszczam, że gdy podane są zarówno 'by.x' i' by.y', wybierana jest nazwa z pierwszej. – A5C1D2H2I1M1N2O1R2T1

+0

O tak ... dobrze wiedzieć. Dzięki. – Elizabeth

4

Argumenty "by" muszą być nazwami kolumn. Coś jak to będzie działać

merge(cbind(df1, row=row.names(df1)), df2, by.x="row", by.y="site") 
Powiązane problemy