2017-03-03 4 views
0

Ich habe versucht, nach etwas zu suchen, aber kann es nicht finden. Ich habe ähnliche Threads gefunden, aber sie bekommen immer noch nicht, was ich will. Ich weiß, dass es eine einfache Möglichkeit geben sollte, dies zu tun, ohne eine Schleifenfunktion zu schreiben. Hier geht esPassende Spalten mit anderen Spalten in Datenrahmen und Hinzufügen bestimmter Spalten mit übereinstimmenden Werten

Ich habe zwei Datenrahmen DF1 und DF2

df1 <- data.frame(ID = c("a", "b", "c", "d", "e", "f"), y = 1:6) 
df2 <- data.frame(x = c("a", "c", "g", "f"), f=c("M","T","T","M"), obj=c("F70", "F60", "F71", "F82")) 
df2$f <- as.factor(df2$f) 

jetzt ich DF1 und DF2 „ID“ und „x“ Spalte miteinander übereinstimmen soll. Aber ich möchte dem df1-Datenrahmen, der mit "ID" und "x" übereinstimmt, auch neue Spalten hinzufügen. Die endgültige Ausgabe von DF1 sollte wie folgt aussehen

ID y obj f1 f2 
    a 1 F70 M NA 
    b 2 NA NA NA 
    c 3 F60 NA T 
    d 4 NA NA NA 
    e 5 NA NA NA 
    f 6 F82 M NA 
+0

Warum 'T' ist in' f2' Spalte? Was bedeuten die Spalten 'f1' und' f2'? –

+0

sie repräsentieren die Spalte f in df2 – arezaie

Antwort

1

Hier ist ein Basis-R-Prozess.

# combine the data.frames 
dfNew <- merge(df1, df2, by.x="ID", by.y="x", all.x=TRUE) 

# add f1 and f2 variables 
dfNew[c("f1", "f2")] <- lapply(c("M", "T"), 
           function(i) factor(ifelse(as.character(dfNew$f) == i, i, NA))) 

# remove original factor variable 
dfNew <- dfNew[-3] 
    ID y obj f1 f2 
1 a 1 F70 M <NA> 
2 b 2 <NA> <NA> <NA> 
3 c 3 F60 <NA> T 
4 d 4 <NA> <NA> <NA> 
5 e 5 <NA> <NA> <NA> 
6 f 6 F82 M <NA> 
2

Wir können dies die beiden Datensätze nach dem Verbinden mit tidyverse tun und spread der ‚f‘ Spalte

library(tidyverse) 
left_join(df1, df2, by = c(ID = "x")) %>% 
       group_by(f) %>% 
       spread(f, f) %>% 
       select(-6) %>% 
       rename(f1 = M, f2 = T) 
# A tibble: 6 × 5 
# ID  y obj  f1  f2 
#* <chr> <int> <fctr> <fctr> <fctr> 
#1  a  1 F70  M  NA 
#2  b  2  NA  NA  NA 
#3  c  3 F60  NA  T 
#4  d  4  NA  NA  NA 
#5  e  5  NA  NA  NA 
#6  f  6 F82  M  NA 

oder ein ähnlicher Ansatz mit data.table

library(data.table) 
dcast(setDT(df2)[df1, on = .(x = ID)], x+obj + y ~ f, value.var = 'f')[, -6, with = FALSE] 
Verwandte Themen