【发布时间】:2019-08-06 20:49:03
【问题描述】:
我有一个这样的数据框:
df = data.frame(x = c("1_1_1", "2_1_1", "3_1_1"),
y = c("1_1_1", "1_1_1", "1_1_1"),
z = c("1_1_1", "4_1_1", "1_1_1"))
我现在想动态检查我的所有列并检查是否有任何 两个 列具有相同的值每行。所以我想比较 x 和 y,x 和 z 以及 y 和 z。请注意,我实际上有更多的专栏。
期望的结果是删除至少有一个重复值的每一行,即在我的示例中,我想删除第 1 行(因为所有值都相同)和第 3 行(因为 y 和 z 相同)。
也许另一个注意事项:实际上我的数据框有大约 30m 行。
我知道有 duplicated 或 anyDuplicated 函数,但 AFAIK 这些假设我同时检查所有列中的重复项,而我希望基于成对列比较来获得它。
编辑:与这个问题有点相关(不确定这是否会使事情变得更容易):我创建 df df 的方式是我有一个像 x=c("1_1_1", "2_1_1", "3_1_1", "1_2_1") 这样的字符变量和依此类推,然后我使用expand.grid 函数:
df = expand.grid(x, x, x)
首先导致重复。所以理想情况下,我会以一种从一开始就防止这些重复的方式来创建df 数据框?
【问题讨论】:
-
我不明白为什么要检查整行中的重复项时需要成对比较。在哪种情况下
df[!apply(df, 1, function(x) any(duplicated(x))), ]会失败? -
您的最后一次编辑完全改变了您的问题。您的实际问题是您混淆了排列和组合... A/B 问题的完美示例导致问题标题根本不匹配答案。请编辑...
-
感谢@RonakShah。这行得通。成对比较只是我的猜测。不确定
any(duplicated())部分在幕后做了什么,但它给出了正确的结果。 -
@antoine-sac 我同意我有两个问题(一个是在我编辑后添加的),但这并不会使我最初的问题无效。 Ronak Shah 提供了一个解决方案。我也同意,如果我从一开始就以不同的方式创建了我的 df(请参阅我的帖子),则不会发生此问题。但是,这是基于组合和排列的混淆,您并不完全正确,因为在我的情况下顺序很重要(所以组合是错误的),即在我的情况下,“1_1_1 // 2_1_1 // 3_1_1”是不同的比“2_1_1 // 1_1_1 // 3_1_1”。
-
@deschen 好的。我在下面的回答中也添加了这一点。
标签: r duplicates tidyverse