2017-06-27 3 views
0

I mit nur einer Spalte einer Tabelle haben:Mapping mehrere Elemente in einer Zelle in einem Datenrahmen zu einem anderen Datenrahmen in R

df <- data.frame(Interest = c("a,b,c,d,e","a,b,d","e,c,b","d,f")) 

Interest 
---- 
a,b,c,d,e 
a,b,d 
e,c,b 
d,f 

Ein weiterer Datenrahmen

df1 <- data.frame(Key = c("a","b","c","d","e","f"), Value = c("1","2","3","4","5","6")) 

Key | Value 
---- 
a | 1 
b | 2 
c | 3 
d | 4 
e | 5 
f | 6 

Erwartete Ausgabe ist:

df <- data.frame(Interest = c("a,b,c,d,e","a,b,d","e,c,b","d,f"), Mapped = c("1,2,3,4,5","1,2,4","5,3,2","4,6")) 

Interest | Mapped 
---- 
a,b,c,d,e | 1,2,3,4,5 
a,b,d | 1,2,4 
e,c,b | 5,3,2 
d,f | 4,6 

Eins-zu-Eins-Zuordnung ist ziemlich einfach. Aber in diesem Fall habe ich eine Liste, die zugeordnet werden muss. Würde mich über Hilfe freuen.

+3

Bitte postet in Ihre Frage Ihre Daten, die die Ausgabe von 'dput' oder in Code verwenden, anstatt im aktuellen Format. Es ist derzeit ziemlich schwer zugänglich, und wir kennen die wahre Struktur dahinter nicht. – lmo

Antwort

2

Ich bin mir nicht sicher, warum Sie dieses Ausgabeformat benötigen, aber dieser Code liefert, was Sie wollen.

library(tidyr) 
library(dplyr) 

df$Id=1:dim(df)[1] 
df=df %>% 
    transform(input = strsplit(input, ",")) %>% 
    unnest(input) 
df=merge(df,map,by.x='input',by.y='key',all.x=T) 
df%>%group_by(Id)%>%dplyr::summarise(Interest=paste(input,collapse = ","),Mapped=paste(value,collapse = ",")) 

# A tibble: 4 × 3 
    Id Interest Mapped 
    <chr>  <chr>  <chr> 
1  1 a,b,c,d,e 1,2,3,4,5 
2  2  a,b,d  1,2,4 
3  3  b,c,e  2,3,5 
4  4  d,f  4,6 
1

Mein kleiner Datenmenge, weil ich faul bin:

interest = data.frame(interest = c('a,b,c', 'a,c')) 
keyvalue = data.frame(kv = c('a|1', 'b|2', 'c|3')) 

qdap::mgsub nutzen könnten. Um einige der "schweren Heben"

speziell zu machen, nehmen wir das Schlüsselwertpaar und erstellen eine zweispaltige data.frame mit Hilfe von Tidyr getrennt. Verwenden Sie dann qdap::mgsub, um einen Vektor von Mustern und Ersetzungen zu erhalten.

library(dplyr) 
library(tidyr) 
keyv <- keyvalue %>% separate(kv, into = c('Interest', 'Value'), sep = '\\|') 
library(qdap) 
interest$interest <- paste0(interest$interest, 
          '|', 
          mgsub(keyv$Interest, keyv$Value, interest$interest)) 

Ausgang:

 interest 
1 a,b,c|1,2,3 
2  a,c|1,3 
+0

Ich mag Ihre Antwort ~ Aber ich OP modifiziert nur den Eingabedaten-Typ ~ – Wen

+0

Sieht aus wie die Eingabedaten nur nicht mehr zu verwenden müssen 'tidyr :: separate' da das Schlüsselwert-Paar bereits in zwei Spalten ist. Danke für das Aufzeigen –

3

Ein einfaches strsplit mit einem sapply funktionieren sollte:

df$Mapped <- sapply(strsplit(as.character(df$Interest), split = ","), 
        function(x) paste0(df1[match(x, df1$Key), "Value"], collapse = ",")) 

df 
# Interest Mapped 
#1 a,b,c,d,e 1,2,3,4,5 
#2  a,b,d  1,2,4 
#3  e,c,b  5,3,2 
#4  d,f  4,6 
+0

Große Antwort für Map ~ upvoted – Wen

Verwandte Themen