【问题标题】:Merging datasets where the key is on the column of one dataset and row of another in R合并数据集,其中键位于 R 中一个数据集的列和另一个数据集的行上
【发布时间】:2016-11-08 19:53:26
【问题描述】:

如何在 R 中合并键在一个数据集的列和另一个数据集的行上的数据集?

示例数据:

group = c("a", "b", "c", "c")
id1 = c(1, 0, 0, 0) 
id2 = c(0, 1, 0, 1)
id3 = c(0, 0, 1, 0) 
df1 = data.frame(group,id1, id2, id3) 
df1

id = c("id1", "id2", "id3") 
iv1 = c(2, 3, 3) 
iv2 = c(3, 2, 3) 
df2 = data.frame(id, iv1, iv2) 
df2

我喜欢按 id 合并这两个数据集。我可以通过 ifelse 来实现:

df1$iv1 = ifelse(df1$id1 == 1, 2, 3)
df1$iv2 = ifelse(df1$id2 == 1, 2, 3)

结果:

  group id1 id2 id3 iv1 iv2
1     a   1   0   0   2   3
2     b   0   1   0   3   2
3     c   0   0   1   3   3
4     c   0   1   0   3   2

如果说我有 1000 个变量要合并,那么 ifelse 方法会很乏味。有没有更有效的方法来合并这些数据集?

【问题讨论】:

  • df1中的ID列是互斥的吗?您是否会遇到 id1 = 1 且 id2 = 1 的行的情况?如果是这样,预期的输出是什么?

标签: r merge


【解决方案1】:

我们可以利用第一个的列顺序与第二个的行顺序相匹配的事实。

df1[c("iv1", "iv2")] <- df2[max.col(df1[-1]),-1]
#   group id1 id2 id3 iv1 iv2
# 1     a   1   0   0   2   3
# 2     b   0   1   0   3   2
# 3     c   0   0   1   3   3
# 4     c   0   1   0   3   2

【讨论】:

    【解决方案2】:

    Pierre Lafortune 已经给出了很好的答案。我仍然会发布我的解决方案:

    ids <- colnames(df1[, 2:4])
    ids <- apply(df1[, 2:4], 1, function(x) return(ids[as.logical(x)]))
    
    df1$id <- ids
    new_df <- merge(df1, df2, by="id", all.x = TRUE, sort=FALSE)
    
    > new_df
       id group id1 id2 id3 iv1 iv2
    1 id1     a   1   0   0   2   3
    2 id2     b   0   1   0   3   2
    3 id2     c   0   1   0   3   2
    4 id3     c   0   0   1   3   3
    

    【讨论】:

      【解决方案3】:

      Pierre 和 Istrel 的答案都很好。对于这个和更复杂的操作,您还可以使用 Hadley Wickham 流行的 tidyr 包:

      install.packages('tidyr', repos='http://cran.rstudio.org')
      library(tidyr)
      
      g1 <- gather(df1, idx, id_val, -group)  # colnames are in 'idx'; 12 rows total
      g1 <- g1[g1$id_val==1, ]                # drop rows with id_val == 0
      g2 <- merge(g1, df2, by.x='idx', by.y='id')
      g3 <- spread(g2, idx, id_val)           # pivot the 'idx' column back out
      g3
      #   group iv1 iv2 id1 id2 id3
      # 1     a   2   3   1  NA  NA
      # 2     b   3   2  NA   1  NA
      # 3     c   3   2  NA   1  NA
      # 4     c   3   3  NA  NA   1
      g3[is.na(g3)] <- 0
      g3
      #   group iv1 iv2 id1 id2 id3
      # 1     a   2   3   1   0   0
      # 2     b   3   2   0   1   0
      # 3     c   3   2   0   1   0
      # 4     c   3   3   0   0   1
      

      【讨论】:

        猜你喜欢
        • 2021-08-07
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 2015-08-20
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        相关资源
        最近更新 更多