R 如何组合多行并检查变量是否匹配

R 如何组合多行并检查变量是否匹配,r,R,我是R的新手。我想知道是否有一个简单的解决方案可以解决我的情况 我有3个重复数据的数据集 A CARDID BSTN ASTN USERTYPE INVDIST INVTIME BSEC TRNID BSTN.r ASTN1 BSTN2 TRNID2 ASTN2 BSTN3 TRNID3 ASTN3 BSTN4 TRNID4 ASTN4 BSTN5 TRNID5 ASTN.r 2406 5786 150 151 6 1100 340 219

我是R的新手。我想知道是否有一个简单的解决方案可以解决我的情况

我有3个重复数据的数据集

A

       CARDID BSTN ASTN USERTYPE INVDIST INVTIME  BSEC TRNID BSTN.r ASTN1 BSTN2 TRNID2 ASTN2 BSTN3 TRNID3 ASTN3 BSTN4 TRNID4 ASTN4 BSTN5 TRNID5 ASTN.r
2406     5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151
2406.1   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151
2406.2   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151
4037     9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151
4037.1   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151
4037.2   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151
       ASEC.r tr_in tr_out
2406    22234     0      0
2406.1  22234     0      0
2406.2  22234     0      0
4037    20547     0      0
4037.1  20547     0      0
4037.2  20547     0      0
另一个数据集是这样的。第二个数据集由列组成。它们是第一个数据集中列的子部分

B

   BSTN tr_in ASTN1 BSTN2 ASTN2 BSTN3 ASTN3 BSTN4 ASTN4 BSTN5  ASTN tr_out 
1   150     0     0     0     0     0     0     0     0     0   151      0  
2   150   426   422   205     0     0     0     0     0     0   151    201     
3   150  4201  4203   239     0     0     0     0     0     0   151    201     
  • 有没有办法找到这两个数据集? 我尝试复制第二个数据集并使用cbind(A,B),但结果是我看不到的“大矩阵”形式

  • 有没有办法比较第一个数据集和第二个数据集,以检查它们是否匹配? 这就是为什么我试图对它们进行列绑定,但有更简单的解决方案吗

==========已编辑========= 我想创造的是

       CARDID BSTN ASTN USERTYPE INVDIST INVTIME  BSEC TRNID BSTN.r ASTN1 BSTN2 TRNID2 ASTN2 BSTN3 TRNID3 ASTN3 BSTN4 TRNID4 ASTN4 BSTN5 TRNID5 ASTN.r
2406     5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151
2406.1   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151
2406.2   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151
4037     9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151
4037.1   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151
4037.2   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151
       ASEC.r tr_in tr_out  BSTN tr_in ASTN1 BSTN2 ASTN2 BSTN3 ASTN3 BSTN4 ASTN4 BSTN5 ASTN tr_out  match
2406    22234     0      0   150     0     0     0     0     0     0     0     0     0    151    0     1
2406.1  22234     0      0   150  4201  4203   239     0     0     0     0     0     0   151    201    0
2406.2  22234     0      0   150  4201  4203   239     0     0     0     0     0     0   151    201    0  
4037    20547     0      0   150     0     0     0     0     0     0     0     0     0   151      0    1
4037.1  20547     0      0   150   426   422   205     0     0     0     0     0     0   151    201    0 
4037.2  20547     0      0   150  4201  4203   239     0     0     0     0     0     0   151    201    0 

因此,如果我比较数据集A、B,我想在A中添加一个新列,如果它们匹配,则显示1;如果它们不匹配,则显示0。有没有办法比较第一个数据集和第二个数据集,以检查它们是否匹配?

代码:

library('data.table')
col_nm <- names(df2)[names(df2) %in% names(df1)]
setDT(df1)[df2, on = col_nm, nomatch = 0]
#    CARDID BSTN ASTN USERTYPE INVDIST INVTIME  BSEC TRNID BSTN.r ASTN1 BSTN2 TRNID2 ASTN2 BSTN3 TRNID3 ASTN3  BSTN4 TRNID4 ASTN4 BSTN5 TRNID5 ASTN.r ASEC.r tr_in tr_out trips
# 1:   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0  0      0     0     0      0    151  22234     0      0  1143
# 2:   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0  0      0     0     0      0    151  22234     0      0  1143
# 3:   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0  0      0     0     0      0    151  22234     0      0  1143
# 4:   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0  0      0     0     0      0    151  20547     0      0  1143
# 5:   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0  0      0     0     0      0    151  20547     0      0  1143
# 6:   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0  0      0     0     0      0    151  20547     0      0  1143
df1 <- read.table(text = 'CARDID BSTN   ASTN USERTYPE INVDIST INVTIME  BSEC TRNID BSTN.r ASTN1 BSTN2 TRNID2 ASTN2 BSTN3 TRNID3 ASTN3 BSTN4 TRNID4 ASTN4 BSTN5 TRNID5   ASTN.r  ASEC.r tr_in   tr_out
                         2406     5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151  22234     0      0
                         2406.1   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151  22234     0      0
                         2406.2   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151  22234     0      0
                         4037     9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151  20547     0      0
                         4037.1   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151  20547     0      0
                         4037.2   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151  20547     0      0', header = TRUE, stringsAsFactors = FALSE)

df2 <- read.table(text = 'BSTN tr_in ASTN1 BSTN2 ASTN2 BSTN3 ASTN3 BSTN4 ASTN4 BSTN5  ASTN tr_out trips
1   150     0     0     0     0     0     0     0     0     0   151      0  1143
                  2   150   426   422   205     0     0     0     0     0     0   151    201     2
                  3   150  4201  4203   239     0     0     0     0     0     0   151    201     2', header = TRUE, stringsAsFactors = FALSE)
数据:

library('data.table')
col_nm <- names(df2)[names(df2) %in% names(df1)]
setDT(df1)[df2, on = col_nm, nomatch = 0]
#    CARDID BSTN ASTN USERTYPE INVDIST INVTIME  BSEC TRNID BSTN.r ASTN1 BSTN2 TRNID2 ASTN2 BSTN3 TRNID3 ASTN3  BSTN4 TRNID4 ASTN4 BSTN5 TRNID5 ASTN.r ASEC.r tr_in tr_out trips
# 1:   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0  0      0     0     0      0    151  22234     0      0  1143
# 2:   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0  0      0     0     0      0    151  22234     0      0  1143
# 3:   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0  0      0     0     0      0    151  22234     0      0  1143
# 4:   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0  0      0     0     0      0    151  20547     0      0  1143
# 5:   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0  0      0     0     0      0    151  20547     0      0  1143
# 6:   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0  0      0     0     0      0    151  20547     0      0  1143
df1 <- read.table(text = 'CARDID BSTN   ASTN USERTYPE INVDIST INVTIME  BSEC TRNID BSTN.r ASTN1 BSTN2 TRNID2 ASTN2 BSTN3 TRNID3 ASTN3 BSTN4 TRNID4 ASTN4 BSTN5 TRNID5   ASTN.r  ASEC.r tr_in   tr_out
                         2406     5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151  22234     0      0
                         2406.1   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151  22234     0      0
                         2406.2   5786  150  151        6    1100     340 21996  1672    150     0     0      0     0     0      0     0     0      0     0     0      0    151  22234     0      0
                         4037     9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151  20547     0      0
                         4037.1   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151  20547     0      0
                         4037.2   9737  150  151        6    1100     320 20368  2191    150     0     0      0     0     0      0     0     0      0     0     0      0    151  20547     0      0', header = TRUE, stringsAsFactors = FALSE)

df2 <- read.table(text = 'BSTN tr_in ASTN1 BSTN2 ASTN2 BSTN3 ASTN3 BSTN4 ASTN4 BSTN5  ASTN tr_out trips
1   150     0     0     0     0     0     0     0     0     0   151      0  1143
                  2   150   426   422   205     0     0     0     0     0     0   151    201     2
                  3   150  4201  4203   239     0     0     0     0     0     0   151    201     2', header = TRUE, stringsAsFactors = FALSE)

df1我认为这里的逻辑可能有漏洞,但我将陈述一些假设:

  • nrow(A)
    始终是
    nrow(B)
    的整数倍;这意味着
    A[1,]
    仅与
    B[1,]
    A[2,]
    B[2,]
    ,…,
    A[4,]
    B[1,]
    A[5,]
    B[2,]
    等配对
  • 比较测试是“公共列中的相等性”
如果这些是真的,那么


incommon
cbind
表明两个帧具有相同的行数,但它们没有。我怀疑您需要在这里进行
合并
操作,但我只能猜测/推断这里将使用什么逻辑。这将是有益的(也许对你来说也是),因为你手动创建了你认为应该是什么样子(完全是,对于这些6行和3行框架),并解释您使用什么逻辑将
B
中的每一行多次分配到
A
@r2evans我编辑了我的问题谢谢您您的预期输出仍然令人困惑:您从6行和3行框架开始,您的输出看起来像是6行
A
和2行
B
的简单绑定。你为什么任意删除
B[3,]
?是什么使A[1,]
与B[1,]
匹配?在代码> C[3:6,] < /代码>中的空白行的意图是什么?(代码< >代码>代码>是您想要的输出)?
A[1,]
中的所有数字是否真的与
B[1,]
单独配对,或者您是否试图以其他方式在
A
中的所有行与
B
中的所有行之间找到匹配项?你的逻辑还没有阐明。@r2evans我真的很抱歉这个错误的解释。英语不是我的第一语言。C中的空白行应该填写。对我想要的输出是B中的列绑定到A,新列显示B中的变量是否与A中的变量匹配。如果它们匹配,我希望新添加的列为1,如果不匹配,则为0。这就是为什么我试图复制B[1:3]以匹配A中的行数,然后将B与A进行比较以标记1或0。如果相同名称的列中的值匹配您的英语很好,这是让我困惑的逻辑:-)那么
A[1,]
总是与
B[1,]
配对吗?数据中是否有某种固有的东西意味着
A[4,]
没有必要尝试与(比如)B[2,]进行比较?是否有一列是“通用”的,以便将具有一个值的
a
中的行与具有相同值的
B
中的行进行比较?非常感谢!!!!我衷心感谢你的工作。工作完美,解释令人惊讶。谢谢你,埃文斯。