R-比较两个矩阵,找出哪些行不是';两者都不相同
我在R中有两个大小不同的大矩阵,371 x 1502(A)和371 x 1207(B) 所有矩阵B都包含在A中。A还包含许多其他混合行。我正在寻找一种方法来创建一个新的矩阵C,它包含a中所有在B中找不到的行 我确信有一种方法可以使用data.tables和key来实现这一点,但我一辈子都搞不清楚 示例数据:R-比较两个矩阵,找出哪些行不是';两者都不相同,r,matrix,data.table,R,Matrix,Data.table,我在R中有两个大小不同的大矩阵,371 x 1502(A)和371 x 1207(B) 所有矩阵B都包含在A中。A还包含许多其他混合行。我正在寻找一种方法来创建一个新的矩阵C,它包含a中所有在B中找不到的行 我确信有一种方法可以使用data.tables和key来实现这一点,但我一辈子都搞不清楚 示例数据: a = t(matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3)) b = t(matrix(c(1,2,3,7,8,9), nrow = 3)) 感谢您的帮助 谢
a = t(matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3))
b = t(matrix(c(1,2,3,7,8,9), nrow = 3))
感谢您的帮助
谢谢。我会在R座上做:
a[!duplicated(rbind(b,a))[(nrow(b)+1):(nrow(a)+nrow(b))], ]
。。。但是data.table解决方案可能更优雅和/或更快
感谢@thelatemail,以下是
数据。表
版本:
a[!b, on=names(a)]
以下是迄今为止提出的所有解决方案的基准: 对于这个问题,另一个答案中提出的
plyr
解决方案是最快的。两个data.table
解决方案紧随其后,而基本R
版本则慢得多
Unit: milliseconds
expr min lq mean median uq max neval cld
BASE_R 1125.05968 1412.13170 1555.82674 1577.81665 1703.3674 1927.1632 100 c
DATA.TABLE 54.68581 83.99182 117.90571 91.86808 123.8300 318.3788 100 b
DATA.TABLE2 58.44053 86.90981 127.11152 97.39086 138.8306 328.1396 100 b
PLYR 30.87235 49.32260 61.02968 53.66639 59.6925 278.6965 100 a
这是你想要的吗
使用dplyr::anti_join:
require(dplyr);
anti_join(as.data.frame(a), as.data.frame(b));
# V1 V2 V3
#1 4 5 6
使用数据表::fsetdiff
:
require(data.table);
fsetdiff(as.data.table(a), as.data.table(b));
# V1 V2 V3
#1: 4 5 6
样本数据
A和B中的行在实际矩阵中的长度不相同?我认为您需要一个反连接。奇怪的是,这是一个封闭问题重复的-并且从前面的问题中窃取-
A[!interaction(data.frame(A))%in%interaction(data.frame(B)),]
感谢大家的帮助,我从来没有注意到我搜索中的前一个问题。非常感谢:)您可能也希望在其中放置一个drop=FALSE
,这样,如果只有一行符合条件,就会返回一个矩阵(如本例中所示)。如果要添加data.table解决方案,则data.table解决方案是一个反连接-a[!b,on=names(a)]
我收到此解决方案的一个错误:a[!b,on=names(a)]:(下标)逻辑下标太长。你知道为什么吗?
require(data.table);
fsetdiff(as.data.table(a), as.data.table(b));
# V1 V2 V3
#1: 4 5 6
# Your sample data
a = t(matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3))
b = t(matrix(c(1,2,3,7,8,9), nrow = 3));