我有一个约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.
使用按行散列的解决方案:
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上的集合会清除它已经具有的重复值。所以我只是想知道什么是实