当前位置: 首页 > 知识库问答 >
问题:

删除重复项,使用“饼干屑”记住删除的原因

巢烨
2023-03-14

我有一个约500000行45列的数据集。我想删除彼此重复的行,就像R“unique()”函数所做的那样(保留第一个匹配项,删除其余的),但是对于删除的每一行,我想存储保留的行与之相等的行。

我要用另一种方式说同样的话,因为我觉得这有点难以解释。对于数据集中的每一组相同行(称为S),我只希望在数据集中保留其中一行(称为保留的行K)。我想丢弃其他大小相同的行(称它们为D)。对于D中的每个元素,我想知道K的索引。

我可以用for循环来实现这一点,但我想知道是否有一种更优雅的方法可以使用unique()、duplicated()等。注意,我使用变量名“preventors”表示K,“dups”表示D,“dups.I”表示D的索引。

pioneers <- unique(genos.varying)
dupes.i <- duplicated(genos.varying)
dupes <- genos.varying[dupes.i,]

# note -- look at the rowname of the pioneer to see where it was in the 'original' dataset
which.pioneer.by.dupes <- matrix(data=NA, nrow=nrow(dupes))

for(d in 1:nrow(dupes)) {

    for(p in 1:nrow(pioneers)) {

        if (all(pioneers[p,] == dupes[d,])) {

            which.pioneer.by.dupes[d] <- p
        }
    }
}

谢谢你提供的任何建议!

此外,这里还有一个实践数据集,以便于人们使用:

genos.varying <- matrix(c(1,2,3,7,6,4,1,2,3,4,3,6), ncol = 3, byrow=TRUE)

输出应大致如下:

Keep rows 1,2, and 4.  Row 3 is a duplicate of row 1.

共有1个答案

窦国源
2023-03-14

使用按行散列的解决方案:

library(digest)
g <- matrix(c(1,2,3,7,6,4,1,2,3,4,3,6, 1,2,3, 7,6,4), ncol = 3, byrow=TRUE)
df <- as.data.frame(g)
df$digest <- apply(g,1,digest)

keep <- sort(as.integer(by(df, df$digest, function(x) rownames(x)[1])))
cat('keeping rows ', paste0(keep, collapse=', '), '\n')

res <- by(df, df$digest, function(x) {
    set <- sort(as.integer(rownames(x)))
    if (length(set) > 1)
      cat('row(s) ', paste0(set[-1], collapse=', '), ' are duplicates of row ', set[1], '\n')
    set
 })

输入是:

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    7    6    4
[3,]    1    2    3
[4,]    4    3    6
[5,]    1    2    3
[6,]    7    6    4

输出为:

keeping rows  1, 2, 4
row(s)  6  are duplicates of row  2 
row(s)  3, 5  are duplicates of row  1 
 类似资料:
  • 请注意,在转向您之前,我已经浏览了各种帖子。事实上,我尝试实现中提供的解决方案:基于“notin”条件从数据帧中删除行 我的问题如下。让我们假设我有一个巨大的数据帧,我想删除重复的数据帧。我很清楚我可以使用drop_duplicates,因为这是最快的最简单的方法。然而,我们的老师希望我们创建一个包含重复项ID的列表,然后根据这些值是否包含在上述列表中删除它们。 现在,让我们看看输出: 因此,我得

  • 问题内容: 如何从以以下方式设置的表中删除重复项? 一个工作人员可以有多个与他们相关联的type_ID,我想删除所有重复的类型。如果有重复项,我想删除具有最新条目的类型。 问题答案: 窗口函数row_number()的教科书候选: 这也照顾了一组相同的受骗者的情况。 请参阅有关data.SE的简化演示。 更新较简单的版本 事实证明,这可以简化:在SQL Server中,您可以直接从CTE中删除:

  • 问题内容: 我正在研究一种方法,以递归方式删除ArrayList中元素的重复项。但是我遇到了一个问题,我的方法有效并删除了一些元素,但不是所有重复项。 这是我的输入: 这是输出: 而我的方法: 我知道我只是删除了所述值的最后一个元素,然后迭代到下一个元素。我想知道如何更改此设置以删除所有重复的元素。另外,我的输出的一部分使我感到困惑,其中有三个值“ 400”,但输出中只显示一个。 谢谢您的帮助。

  • 我正在尝试创建一个搜索算法,该算法将坐标对存储在一个名为HashSquaresPec的包装器类中。为了避免重复并保持插入顺序,我将每个HashSquareSpec插入到LinkedHashSet中。即使我已经重写了equals()方法和hashCode()方法,LinkedHashSet仍然接受两个具有相同坐标对的HashSquareSpec对象。 HashSquare类 和HashSquareS

  • 问题内容: 请使用以下tsql查询: 我知道它在做什么,但是逻辑的最后一部分(对于每个重复集,在– insert一行之后)没有意义。在我们有用于删除所有重复行的代码集的地方,这消除了重复行,那么上一节的内容是什么? 该查询发现这里 谢谢 问题答案: 在我们有用于删除所有重复行的代码集的地方,这消除了重复行,那么上一节的内容是什么? 首先,它删除曾经有重复的所有行。也就是说,所有行,并且原始也。在上

  • 问题内容: 我有两个列表需要合并,第二个列表忽略了第一个列表的重复项。..有点难以解释,所以让我展示一个代码看起来像什么,以及我想要什么的示例。 您会注意到结果具有第一个列表, 包括 其两个“ 2”值,但是second_list也具有附加的2和5值这一事实并未添加到第一个列表中。 通常,对于这样的事情,我会使用集合,但是first_list上的集合会清除它已经具有的重复值。所以我只是想知道什么是实