R 如何组合多行并检查变量是否匹配
我是R的新手。我想知道是否有一个简单的解决方案可以解决我的情况 我有3个重复数据的数据集 AR 如何组合多行并检查变量是否匹配,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
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,]
等配对
- 比较测试是“公共列中的相等性”
如果这些是真的,那么
incommoncbind
表明两个帧具有相同的行数,但它们没有。我怀疑您需要在这里进行合并
操作,但我只能猜测/推断这里将使用什么逻辑。这将是有益的(也许对你来说也是),因为你手动创建了你认为应该是什么样子(完全是,对于这些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
中的行进行比较?非常感谢!!!!我衷心感谢你的工作。工作完美,解释令人惊讶。谢谢你,埃文斯。