2017-06-27 2 views
0

J'ai des données d'enquête - appelez le survey - où un groupe de personnes a répondu aux questions. J'ai le nom de chaque personne, les questions auxquelles elle répond et leur réponse, le tout en forme longue (le nom de chaque personne est répété des dizaines de fois, une fois pour chaque question).R: Fusionner deux trames de données en fonction de deux conditions de jointure remplies

Nom de l'employé | Question | Réponse

Dans une seconde trame de données - appeler metaData -, j'ai des données supplémentaires sur un sous-ensemble des questions

Nom de l'employé | Question | Évaluation de la question | Plan d'étude pour la question |

Les deux ensembles de données partagent les colonnes Employee Name et Question, qui doivent correspondre exactement.

J'ai besoin de merge() ces deux trames de données, mais ni le nom de l'employé ni la question ne sont suffisants pour fusionner. Lorsque vous combinez Question et Nom de l'employé, il s'agit d'un ID unique. En pseudo-code, merge(survey, metaData, where(employeeSurvey == employeeMeta && questionSurvey == questionMeta). Par exemple, une simple fusion sur un nom d'employé renverrait des centaines de correspondances, mais il ne devrait y en avoir qu'une où le nom d'employé et la question seraient égaux.

Comment puis-je fusionner en fonction de ces deux conditions?

Répondre

1

Vous devriez être en mesure de les jeter dans un vecteur comme

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

Est-ce que cela implique "à la fois" par opposition à "ou"? – Mako212

+0

Oui. Dans l'exemple, j'ai supposé que les noms de champs sont différents dans chaque trame de données. – alaybourn

+0

Parfait, merci! – Mako212

0

Fusionner avec le paquet dplyr

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")) 

Vous avez également d'autres verbes de deux tables, avec la même logique de sql: inner_join , right_join et full_join.