繁体   English   中英

R tidyverse删除动态列数中具有相同值的行

[英]R tidyverse delete rows that have identical values in dynamic number of columns

我有一个这样的数据框:

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相同)。

也许还需要注意:实际上我的数据框有大约3000万行。

我知道这里有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数据帧?

要解决第一个问题,即使用expand.grid创建重复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))), ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM