2017-07-03 3 views
1

Angenommen, ich habe ein df sieht wie folgt aus.Ersetzen Spalte durch eine andere Tabelle

df <- read.table(textConnection(" 
id1 id2 id3  inter 
    1 2 3  7.343 
    6 5 4  2.454 
    1 5 6  3.234 
"), header = TRUE) 

Und ich will Spalte ersetzen id1, id2 und id3 von Quelle Datenrahmen.

source <- read.table(textConnection(" 
sid rid 
    1 a 
    2 b 
    3 c 
    4 43454 
    5 2254 
    6 43 
"), header = TRUE) 

Wenn ich finden kann source$sid zu df$id1 gleich ist, df$id2 oder df$id3, dann will ich sie als source$rid ersetzen.

Als Ergebnis kann ich sehen.

id1 id2 id3 inter 
    a b c 7.343 
43 2254 43454 2.454 
    a 2254 43 3.234 

Irgendein Hinweis bitte?

+0

'Versuch df [] <- lapply (df, Funktion (x) {i1 <- match (x, source $ sid); i2 <-! is.na (i1); x [i2] <- as.zeichen (source $ rid) [i1 [i2]]; x}) ' – akrun

Antwort

1

Sie können tidyverse-gather, left_join und dann spread wieder verwenden, das heißt

library(tidyverse) 

df %>% 
gather(var, sid, -inter) %>% 
left_join(source, by = 'sid') %>% 
select(-sid) %>% 
spread(var, rid) 

# inter id1 id2 id3 
#1 2.454 43 2254 43454 
#2 3.234 a 2254 43 
#3 7.343 a b  c 

Basierend auf Ihren Kommentar, es scheint, dass Sie einige Duplikate haben. Die folgende Gruppierung von var und eine seq eindeutigen Werten zu schaffen sollte ausreichen (obwohl ich nicht testen können, da Ihr Beispiel diesen Fehler nicht erzeugen),

df %>% 
    gather(var, sid, -inter) %>% 
    left_join(source, by = 'sid') %>% 
    select(-sid) %>% 
    group_by(var) %>% 
    mutate(new = seq(n())) %>% 
    spread(var, rid) %>% 
    select(-new) 
+0

danke, aber wenn ich dein Skript zu einem anderen Datensatz verwende, bekomme ich Beschwerden ** Fehler: Doppelte Bezeichner für Zeilen (5464, 5465, 5467 ..... **, wissen warum? – user3058889

+1

@ user3058889. Ja, du hast Duplikate (als Fehlerstatus) Versuchen Sie 'df%>% sammeln (var, sid, -inter)%>% left_join (source, by = 'sid')%>% wählen Sie (-sid)%>% group_by (var)%> % muate (neu = seq (n()))%>% spread (var, los)%>% select (-neu) ' – Sotos

2
tmp <- as.matrix(df[paste0("id", 1:3)]) 
ind <- match(tmp, source$sid) 
tmp[] <- as.character(source$rid)[ind] 
df[paste0("id", 1:3)] <- tmp 
+0

Danke für Hilfe, aber Ihr Skript funktioniert nur für den ersten Austausch, aber wenn ich Elemente in meiner 'df' Datei wiederholt habe? Denn in meinem Fall habe ich mehrere Wiederholungen in den Spalten "id1", "id2" und "id3". Ich habe meine Frage aktualisiert. @F. Privé – user3058889

+0

Ich wusste, dass ich etwas falsch gemacht hatte. Versuchen Sie, die Elemente in der Übereinstimmung zu wechseln, und verwenden Sie dann tmp [] <- as.character (source $ rid) [ind] –

+0

Ich habe meine Antwort mit dieser besseren Lösung bearbeitet. –

Verwandte Themen