2017-07-28 4 views
0

vergleicht Ich habe 2 Datenrahmen und ich versuche, nur eine Spalte von einem Datenrahmen in den anderen Datenrahmen zu kopieren, indem man 3 Spalten im ersten zusammenbringt Datenrahmen zu 3 Spalten im zweiten Datenrahmen. Ich möchte die Datenframes nicht vollständig zusammenführen, da meine realen Datenframes jeweils zu viele Spalten haben und ich nicht möchte, dass sie alle zusammen sind.Wie man eine Spalte von einem Datenrahmen in einen anderen kopiert, indem man 3 Spalten in jedem

Hier sind zB Datenrahmen:

df1

 ID_num Terr_Bred Dispersal_Dist Year_Bred 
    1   1  BAM    760  1987 
    2   2  GRE   1006  1993 
    3   3  MEW    999  2000 

df2

 Mal_ID Date_Rec Year Terr Pair_ID Fem_ID 
    1   4 3/22/1987 1987 BAM  87  1 
    2   7 2/22/1987 1987 YER  43  1 
    3   5 1/17/1993 1993 GRE  22  2 
    4   8 2/14/1991 1991 GRE  91  2 
    5   6 10/1/2000 2000 MEW  65  3 

Ich möchte diese:

 ID_num Year_Bred Terr_Bred Dispersal_Dist Mate_ID_num 
    1   1  1987   BAM    760   4 
    2   2  1993   GRE    1006   5 
    3   3  2000   MEW    999   6 

Also, ich versuche das hinzufügen Mal_ID Spalte von DF2 in DF1 und benennen Sie die Spalte Mate_ID_num um. Dazu möchte ich die Spalte ID_num von df1 zur Spalte Fem_ID in df2, die Spalte Year_Bred von df1 zur Spalte Year in df2 und die Spalte Terr_Bred von df1 zur Spalte Terr in df2 zuordnen. Wie in den obigen Beispielen zu sehen ist, unterscheiden sich die Namen für die Spalten in jedem Datenrahmen.

Ich konnte keinen Weg finden, dies zu tun, ich habe nur Beispiele gefunden, wo Sie Datenrahmen vollständig zusammenführen oder wo Sie eine Spalte basierend auf der Übereinstimmung einer einzelnen Spalte in jedem Datenrahmen, nicht mehrere hinzufügen.

Antwort

1

Sie auch das gleiche tun dplyr verwenden, die ein wenig ausdrucksvoller als Basis R:

library(dplyr) 

df <- df1 %>% 
    left_join(df2, c("ID_num" = "Fem_ID", "Year_Bred" = "Year", "Terr_Bred" = "Terr")) %>% 
    rename(Mate_ID_num = Mal_ID) %>% 
    select(1:5) 
+0

danke !! das hat wirklich gut für mich funktioniert! –

1

1) Basis Dies wird als linke bekannt beitreten:

by.x <- c("ID_num", "Year_Bred", "Terr_Bred") 
by.y <- c("Fem_ID", "Year", "Terr") 

df <- merge(df1[by.x], df2[c(by.y, "Mal_ID")], 
     all.x = TRUE, all.y = FALSE, by.x = by.x, by.y = by.y) 

names(df["Mal_ID"]) <- "Mal_ID_num" 

geben:

> df 
    ID_num Year_Bred Terr_Bred Dispersal_Dist Mate_ID_num 
1  1  1987  BAM   760   4 
2  2  1993  GRE   1006   5 
3  3  2000  MEW   999   6 

Wir haben Namen eher als Stellenschreibweise verwendet, da Sie angegeben haben, dass die Spalten nicht ausgerichtet in dem wirklichen Problem, aber für das Problem, das in der Frage gezeigt wird (bevor die Frage geändert wurde, aber in den reproduzierbaren Eingaben in der Notiz reflektiert wird), wäre die Zusammenführung etwas kürzer mit einer Positionsnotation wie dieser:

df <- merge(df1[1:3], df2[1:4], all.x = TRUE, all.y = FALSE, by = 1:3) 

jedoch

2) Es abwechselnd durchgeführt unter Verwendung von SQL werden könnte:

library(sqldf) 
sqldf("select a.*, b.Mal_ID Ma1_ID_num 
     from df1 a left join df2 b on a.ID_num = b.Fem_ID and 
            a.Year_Bred = b.Year and 
            a.Terr_Bred = b.Terr") 

geben:

ID_num Year_Bred Terr_Bred Dispersal_Dist Ma1_ID_num 
1  1  1987  BAM   760   4 
2  2  1993  GRE   1006   5 
3  3  2000  MEW   999   6 
> 

Hinweis:df1 und df2 in reproduzierbarer Form sind wie folgt. Die Frage hat diese ursprünglich, hat sie dann aber verändert; Die obige Antwort verwendet jedoch die unten gezeigten Originale df1 und df2.

Lines1 <- " 
     ID_num Year_Bred Terr_Bred Dispersal_Dist 
    1   1  1987  BAM    760 
    2   2  1993  GRE   1006 
    3   3  2000  MEW    999" 
df1 <- read.table(text = Lines1, as.is = TRUE) 

Lines2 <- " 
     Fem_ID Year Terr  Mal_ID Pair_ID Date_Rec 
    1   1 1987 BAM   4  87 3/22/1987 
    2   1 1987 YER   7  43 2/22/1987 
    3   2 1993 GRE   5  22 1/17/1993 
    4   2 1991 GRE   8  91 2/14/1991 
    5   3 2000 MEW   6  65 10/1/2000" 
df2 <- read.table(text = Lines2, as.is = TRUE) 
+0

ich neu angeordnet df2 so dass die Spalten ich nicht in einer Reihe aufstellen entsprechen bin versucht, weil in meinen realen Daten die Spalten nicht in jedem Datenrahmen an der gleichen Stelle sind –

+0

sorry, ich ordnete df1 auch um. Ich versuche herauszufinden, wie ich es so machen kann, und zwar: df <- merge (df1, df2 [c (6, 3, 4, 1)], all.x = WAHR, all.y = FALSE , by = c (1, 2, 4)) Namen (df) [5] <- "Mate_ID_num", aber es gibt mir diesen Fehler: "Fehler in fix.by (by.y, y): 'durch' muss Übereinstimmungen von Spalten ". Ich bin nicht sicher, wie der Code angibt, welche Spalten übereinstimmen und welche Spalte übertragen werden soll. –

+0

Sie haben überarbeitet (1), um zu zeigen, wie Sie Namen anstelle von Positionen verwenden. (2) nur bereits verwendete Namen. Dies verwendet Ihre ursprünglichen Datenrahmen, aber es sollte offensichtlich sein, wie Sie das anpassen, wenn sich die Namen geändert haben. –

Verwandte Themen