2017-06-27 2 views
0

Ich habe Umfragedaten - nennen Sie es survey - wo eine Reihe von Menschen auf Fragen geantwortet. Ich habe den Namen jeder Person, die Fragen, die sie beantwortet haben, und ihre Antwort, alles in langer Form (der Name jeder Person wird Dutzende Male wiederholt, einmal für jede Frage).R: Merge zwei Datenrahmen auf der Grundlage von zwei Beitritt Bedingungen erfüllt werden

Name des Mitarbeiters | Frage | Antwort

In einem zweiten Datenrahmen - nennt es metaData -, ich habe zusätzliche Daten über eine Teilmenge der Fragen

Mitarbeiternamen | Frage | Fragenbewertung | Studienplan für die Frage | usw.

Beide Datensätze teilen Mitarbeiter Name und Frage Spalten, die genau übereinstimmen sollten.

Ich brauche merge() diese beiden Datenrahmen, aber weder Mitarbeiter Name noch Frage ist ausreichend, um zu verbinden. Wenn Sie Frage- und Angestelltennamen kombinieren, ist dies eine eindeutige ID. In Pseudocode, merge(survey, metaData, where(employeeSurvey == employeeMeta && questionSurvey == questionMeta).

Wenn Sie beispielsweise nur den Namen eines Mitarbeiters eingeben, werden Hunderte von Übereinstimmungen zurückgegeben. Es sollte jedoch nur einen geben, bei dem sowohl der Name des Mitarbeiters als auch die Frage identisch sind.

Wie kann ich basierend auf diesen beiden Bedingungen zusammenführen?

Antwort

1

Sie sollten in der Lage sein, sie wie

in einem Vektor zu werfen
survey<-data.frame(name=c("John","John","Jane","Jane"), question=c(1,2,1,2),answer=c("Yes","Yes","Yes", "No"),stringsAsFactors = F) 

metaData<-data.frame(first=c("John","John","Jane","Jane"), quest=c(1,2,1,2), age=c("20","20","40", "40"), stringsAsFactors = F) 

merge(survey,metaData, by.x=c('name','question'), by.y=c('first','quest')) 

    name question answer age 
1 Jane  1 Yes 40 
2 Jane  2  No 40 
3 John  1 Yes 20 
4 John  2 Yes 20 
+0

Bedeutet das "beide" im Gegensatz zu "oder"? – Mako212

+0

Ja. Im Beispiel habe ich angenommen, dass die Feldnamen in jedem Datenrahmen unterschiedlich sind. – alaybourn

+0

Perfekt, danke! – Mako212

0

Merge mit dplyr Paket

survey<-data.frame(name=c("John","John","Jane","Jane"), question=c(1,2,1,2),answer=c("Yes","Yes","Yes", "No"),stringsAsFactors = F) 

metaData<-data.frame(first=c("John","John","Jane","Jane"), quest=c(1,2,1,2), age=c("20","20","40", "40"), stringsAsFactors = F) 

library(dplyr) 
left_join(survey, metaData, by = c(name = "first", question = "quest")) 

# or using the pipe 
survey %>% 
    left_join(metaData, by = c(name = "first", question = "quest")) 

Auch Sie haben andere Verben aus zwei Tabellen, mit der gleichen Logik der sql: inner_join , right_join und full_join.

Verwandte Themen