首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要比较两个不同长度的数据,并根据r中的匹配准则更新其中一个数据的列。

需要比较两个不同长度的数据,并根据r中的匹配准则更新其中一个数据的列。
EN

Stack Overflow用户
提问于 2016-04-20 08:56:08
回答 2查看 721关注 0票数 1

我有两个数据格式: df1和df2。df1 > df2的大小。

代码语言:javascript
复制
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

现在我想比较一下

代码语言:javascript
复制
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是日期类型列,比较也是行对行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-20 09:51:22

这几乎是通常的merge欺骗,但是为了更干净的输出和更快的性能,我建议使用data.table二进制左侧联接,并通过引用进行同步更新。有点像

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2016-04-20 09:22:41

根据你的例子,

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36738628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档