【问题标题】:How to merge two dataframes using multiple columns as key?如何使用多列作为键合并两个数据框?
【发布时间】:2015-05-26 14:05:32
【问题描述】:

假设我有以下数据框:

DF1 <- data.frame("A" = rep(c("A","B"), 18),
                  "B" = rep(c("C","D","E"), 12),
                  "NUM"= rep(rnorm(36,10,1)),
                  "TEST" = rep(NA,36))

DF2 <- data.frame("A" = rep("A",6),
                  "B" = rep(c("C","D"),6),
                  "VAL" = rep(c(1,3),3))

*注意:DF2 中变量AB 的每个唯一组合都应该有一个唯一的VAL

对于每一行,如果AA 列中的值匹配并且列中的值匹配,我想将TEST 中的NA 替换为DF1VAL 的相应值BB 匹配该行。否则,我会将TEST 保留为NA。如果不使用 match 循环遍历每个组合,我将如何做到这一点?

理想情况下,答案将扩展到两个数据框,其中包含许多要匹配的列。

【问题讨论】:

  • 我认为在您的 DF2 中有多行可以匹配 DF1 的第 1 列和第 2 列。所以,我不确定应该采用哪个 VAL。另外,根据例子,两个数据集的维度是不一样的。
  • 抱歉,DF2 中的每个唯一组合都应该有一个唯一的 VAL。我需要想办法在示例中对其进行编码。
  • 在这种情况下,DF2 将只有两行,即DF2 &lt;- data.frame(A=rep('A',2), B=c('C', 'D'), VAL=rnorm(2))merge 将得到结果merge(DF1, DF2, all=TRUE)
  • @goldisfine:这并不能说明什么。我们需要知道对于AB 的给定组合应该选择哪个 VAL,因为有多个。
  • 现在DF2 中的每个组合都有一个唯一值,所以我认为DF1 中的每一行只有一个VAL 可能的选项。我猜DF2 可以简化为只有预测变量的唯一组合。

标签: r merge dataframe compound-key


【解决方案1】:
# this is your DF1    
DF1 <- data.frame("A" = rep(c("A","B"), 18),
                      "B" = rep(c("C","D","E"), 12),
                      "NUM"= rep(rnorm(36,10,1)),
                      "TEST" = rep(NA,36))

#this is a DF2 i created, with unique A, B, VAL
DF2 <- data.frame("A" = rep(c("A","B"),3),
                  "B" = rep(c("C","D","E"),2),
                  "VAL" = rep(1:6))

# and this is the answer of what i assume you want      
tmp <- merge(DF1,DF2, by=c("A","B"), all.x=TRUE, all.y=FALSE)
DF1[4] <- tmp[5]

【讨论】:

    【解决方案2】:

    正如 Akrun 在 cmets 中提到的,您的查找表 (DF2) 需要简化为仅具有其独特的 A/B 组合。对于您当前的数据框,这不是问题,但如果同一组合有多个可能的值,您将需要额外的规则。从那里开始,解决方案很简单:

    DF2.u <- unique(DF2)
    DF3 <- merge(DF1, DF2.u, all = T)
    

    请注意,这将生成一个新的数据框,其中包含一个空的 TEST 列(所有值 NA)和一个从 DF2 分配的 VAL 列。要完全按照您的意愿行事(在可能的情况下将 TEST 替换为 VAL),这里有一些稍微笨拙的代码:

    DF1$TEST <- merge(DF1, DF2.u, all = T)$VAL
    

    编辑:针对您的问题,如有必要,您可以很简单地将 DF2 归结为:

    DF2$C <- c(1:12) #now unique() won't work
    DF2.u <- unique(DF2[1:3])
    
     A B VAL
    1 A C   1
    2 A D   3
    

    【讨论】:

    • 在我的实际示例中,我在 DF2 中有数字列,因此如果我传递了整个 DF,那么我将得到一个太大的唯一 DF。我可以将 DF2 子集到仅在因子变量中唯一的行吗?
    • 当然,您采用的实际索引将根据您的额外列的内容和排列方式而有所不同
    • 在 Python pandas 中,您可以简单地使用变量 A、B 设置复合键。然后这是一个简单的左连接/合并。
    猜你喜欢
    • 2019-10-31
    • 2021-05-27
    • 2019-05-04
    • 1970-01-01
    • 2021-05-17
    • 2017-12-27
    • 1970-01-01
    • 2017-12-31
    • 2017-02-13
    相关资源
    最近更新 更多