Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-比较两个矩阵,找出哪些行不是';两者都不相同_R_Matrix_Data.table - Fatal编程技术网

R-比较两个矩阵,找出哪些行不是';两者都不相同

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)) 感谢您的帮助 谢

我在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))
感谢您的帮助


谢谢。

我会在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));