【问题标题】:R: Merge two data frames based on two joining conditions being metR:根据满足的两个加入条件合并两个数据帧
【发布时间】:2017-06-27 18:25:56
【问题描述】:

我有调查数据——称之为survey——一组人回答了问题。我有每个人的名字、他们回答的问题和他们的回答,都是很长的形式(每个人的名字重复了几十次,每个问题一次)。

员工姓名 |问题 |回答

在第二个数据框中——称之为metaData——我有关于问题子集的额外数据

员工姓名 |问题 |问题评估 |问题学习计划|等等。

两个数据集共享 Employee Name 和 Question 列,应该完全匹配。

我需要merge() 这两个数据框,但员工姓名和问题都不足以合并。当您结合问题和员工姓名时,这是一个唯一的 ID。在伪代码中,merge(survey, metaData, where(employeeSurvey == employeeMeta && questionSurvey == questionMeta)

例如,仅合并员工姓名会返回数百个匹配项,但应该只有一个员工姓名和问题相等。

如何根据这两个条件进行合并?

【问题讨论】:

    标签: r merge transformation


    【解决方案1】:

    你应该可以把它们扔进一个像这样的向量中

    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
    

    【讨论】:

    • 这是否意味着“两者”而不是“或”?
    • 是的。在示例中,我假设每个数据框中的字段名称不同。
    • 使用 'merge' 函数的参数 'all.x' = TRUE 或 'all.y = TRUE' 可能很有用。这个论点在不匹配的情况下保存观察结果。
    • @CristóbalAlcázar 谢谢,我最终使用all.x = TRUE 进行左连接。
    【解决方案2】:

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

    还有两张表的其他动词,和sql的逻辑一样:inner_join、right_join和full_join。

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 2016-10-06
      • 2014-04-14
      • 2022-01-16
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多