[英]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万行。
我知道这里有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
数据帧?
要解决第一个问题,即使用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.