这是我的数据:
mymat <- structure(c(3, 6, 9, 9, 1, 4, 1, 5, 9, 6, 6, 4, 1, 4), .Dim = c(7L, 2L))有些行是重复的,其他几行包含相同的元素,尽管它们是按不同顺序排列的。我希望删除所有包含相同元素的行,无论这些元素是相同的(重复的行)还是不同的顺序。这将只保留c(3, 5)的第一行。
我检查了以前的问题这里和这里。但是,我的要求是删除所有这样的行,而不是留下一个这样的行。
我的问题也不同于这一个,它删除了所有重复的行,因为我不仅查找重复的行,还查找包含不同排序的相同元素集的行。例如,行c(6, 9)和c(9, 6)都应该删除,因为它们都包含相同的元素集。
我寻找不使用for循环的解决方案,因为我的实际数据很大,而for循环可能比较慢。
注意:我的完整数据有40k行和2列。
发布于 2021-09-24 12:57:26
我添加了一些数据,以表明矩阵格式仍然是
mymat <- structure(c(3, 6, 9, 9, 1, 4, 1, 10, 12, 13, 14, 5, 9, 6, 6, 4, 1, 4, 11, 13, 12, 15), .Dim = c(11L, 2L))
dup <- duplicated(rbind(mymat, mymat[, c(2, 1)]))
dup_fromLast <- duplicated(rbind(mymat, mymat[, c(2, 1)]), fromLast = TRUE)
mymat_duprm <- mymat[!(dup_fromLast | dup)[1:(length(dup) / 2)], ]
mymat_duprm发布于 2021-09-24 13:24:00
您可以按行排序数据,并使用duplicated -
tmp <- t(apply(mymat, 1, sort))
tmp[!(duplicated(tmp) | duplicated(tmp, fromLast = TRUE)), , drop = FALSE]
# [,1] [,2]
#[1,] 3 5发布于 2021-09-24 12:58:30
作为一个矩阵:
tmp <- apply(mymat, 1, function(z) toString(sort(z)))
mymat[ave(tmp, tmp, FUN = length) == "1",, drop = FALSE]
# [,1] [,2]
# [1,] 3 5之所以需要drop=FALSE,仅仅是因为(至少使用此示例数据)过滤结果在一行中。虽然我怀疑您的实际数据( 40k行)是否会减少到这个值,但我还是建议您将其保存在那里(“以防万一”,这只是防御性编程)。
https://stackoverflow.com/questions/69315138
复制相似问题