2016-04-25 13 views
2

Ich habe einen Datenrahmen (x) mit einer Faktorvariablen, deren Werte durch Komma getrennt sind. Ich habe einen anderen Datenrahmen (y) mit Beschreibung für die gleichen Werte. Jetzt möchte ich die Werte im Datenrahmen (x) durch die Beschreibung vom Datenrahmen (y) ersetzen. Jede Hilfe würde sehr geschätzt werden.Wert von anderem Datenrahmen ersetzen

sagen zum Beispiel die zwei Datenrahmen sieht aus wie unten

data frame (x) 
    s.no x 
    1  2,5,45 
    2  35,5 
    3  45 

data fram (y) 
s.no x description 
1  2  a 
2  5  b 
3  45  c 
4  35  d 

ich die Ausgabe wie unten

s.no x 
1  a,b,c 
2  d,b 
c  c 

Antwort

3

benötigen, können wir split die 'x' Spalte in 'x' Daten-Set von ' , ', Schleife über die list, passen Sie den Wert mit der' x 'Spalte in' y ', um den numerischen Index zu erhalten, erhalten Sie die entsprechenden' Beschreibung 'Wert von' y 'und paste es zusammen.

x$x <- sapply(strsplit(x$x, ","), function(z) 
      toString(y$description[match(as.numeric(z), y$x)])) 

x 
# s.no  x 
#1 1 a, b, c 
#2 2 d, b 
#3 3  c 

HINWEIS: Wenn die 'x' Spalte in 'x' factor Klasse ist, verwenden strsplit(as.character(x$x, ","))

+1

Entschuldigung, habe dich dort nicht gesehen. Meine gelöscht, da es sehr ähnlich ist. Niemand sieht dich jemals ... Du bist wie ein Ninja :) – Sotos

+0

@Sotos Kein Problem. Du kannst eine andere Idee mit 'mgsub' oder etwas ähnlichem entwickeln – akrun

+0

Das kommt von' qdap' oder? ... Ich kann das Paket nicht zum Laufen kriegen ... – Sotos

5

Mit splitstackshape:

library(splitstackshape) 

cSplit(x, 'x', ',', 'long')[setDT(y), on='x'][,.(x=paste(description, collapse=',')), s.no] 

# s.no  x 
#1: 1 a,b,c 
#2: 2 b,d 
#3: 3  c 
+0

Wenn Sie das 'splitstapelshape'-Paket verwenden, ist' setDT' nicht zwingend erforderlich. – h3rm4n

+0

Danke für das Hinzeigen, es ist jetzt ein One Liner :) –

4

Eine Lösung mit dplyr und tidyr:

library(dplyr) 
library(tidyr) 
x %>% 
    separate(x, paste0('x',1:3),',',convert=TRUE) %>% 
    gather(var, x, -1, na.rm=TRUE) %>% 
    left_join(., y, by='x') %>% 
    group_by(s.no = s.no.x) %>% 
    summarise(x = paste(description,collapse = ',')) 

das Ergebnis:

s.no  x 
    (int) (chr) 
1  1 a,b,c 
2  2 d,b 
3  3  c 
+0

Realisierst du, was du gepostet hast, ist nur eine Kopie Paste meiner Lösung? –

+0

@ColonBeauvel Habe es nicht gesehen, nachdem ich gepostet habe. Ich habe die 'cSplit'-Lösung entfernt. – h3rm4n

+0

nette Lösung mit dplyr, +1 –

Verwandte Themen