【问题标题】:R tidyverse delete rows that have identical values in dynamic number of columnsR tidyverse删除在动态列数中具有相同值的行
【发布时间】: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 行。

我知道有 duplicatedanyDuplicated 函数,但 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


【解决方案1】:

要解决使用expand.grid 创建重复的第一个问题,我们可以使用combn 代替,这将为我们提供没有重复的组合

combn(x, 3, simplify = FALSE)

#[[1]]
#[1] "1_1_1" "2_1_1" "3_1_1"

#[[2]]
#[1] "1_1_1" "2_1_1" "1_2_1"

#[[3]]
#[1] "1_1_1" "3_1_1" "1_2_1"

#[[4]]
#[1] "2_1_1" "3_1_1" "1_2_1"

现在我们需要创建具有这种组合的各种排列的行。我们可以手动编写一个函数来创建这种排列或从其中一个包中使用。这里我使用combinat::permn

do.call(rbind.data.frame, combn(x, 3, simplify = FALSE, FUN = function(y) 
        do.call(rbind, combinat::permn(y))))

#      V1    V2    V3
#1  1_1_1 2_1_1 3_1_1
#2  1_1_1 3_1_1 2_1_1
#3  3_1_1 1_1_1 2_1_1
#4  3_1_1 2_1_1 1_1_1
#5  2_1_1 3_1_1 1_1_1
#6  2_1_1 1_1_1 3_1_1
#....

要删除 duplicated 行,我们可以这样做

df[!apply(df, 1, function(x) any(duplicated(x))), ]

【讨论】:

    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2017-11-07
    • 2018-08-09
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多