首页 文章

需要比较两个不同长度的数据帧,并根据r中的匹配条件更新其中一个数据帧的列

提问于
浏览
1

我有两个数据帧df1和df2 . df1> df2的大小 .

df1 -> A      B        C       D     E  F
       1   4-23-2015   abc    dcv    0  0
       2   5-23-2015   abc    dcvm    1  0
       3   4-24-2015   ab    dcv      0  0
       4   4-23-2014   abc    dcv     0  0

df2 -> A      B         C      D     E F
       1   4-23-2015   abc    dcv    0  0
       3   4-24-2015   abc    dcv    0  0
       9   4-23-2015   abc    dcv    0  0

现在我想比较一下

df1$A with df2$A and df1$B with df2$B and when it is true then put df1$F =1. So my output for the above example will be

  df1 -> A      B        C       D     E  F
       1   4-23-2015   abc    dcv    0    1
       2   5-23-2015   abc    dcvm    1   0
       3   4-24-2015   ab    dcv      0   1
       4   4-23-2014   abc    dcv     0   0

列B是日期类型列,并且比较是行与行完成的 .

2 回答

  • 3

    这几乎是一种常见的假设,但是对于更清晰的输出和更快的性能,我建议 data.table 二进制左连接,并通过引用进行同步更新 . 就像是

    library(data.table)
    setDT(df1)[df2, F := 1L, on = c("A", "B")]
    df1
    #    A         B   C    D E F
    # 1: 1 4-23-2015 abc  dcv 0 1
    # 2: 2 5-23-2015 abc dcvm 1 0
    # 3: 3 4-24-2015  ab  dcv 0 1
    # 4: 4 4-23-2014 abc  dcv 0 0
    

    否则,一个简单的 merge(df1, df2, by = c("A", "B"), all.x = TRUE) 将显示哪些行匹配,但您需要删除不必要的列并相应地更新 F .

  • 1

    根据你的例子,

    df1$F[apply(df1[,c('A', 'B')], 1, paste, collapse = '') %in% apply(df2[,c('A', 'B')], 1, paste, collapse = '')] <- 1
    df1
    #  A         B   C    D E F
    #1 1 4-23-2015 abc  dcv 0 1
    #2 2 5-23-2015 abc dcvm 1 0
    #3 3 4-24-2015  ab  dcv 0 1
    #4 4 4-23-2014 abc  dcv 0 0
    

相关问题