R 识别允许x不匹配且忽略NA的重复行

R 识别允许x不匹配且忽略NA的重复行,r,R,我有一个或两个相关的问题 我有一个数据帧(行数>10.000,列数>100)。我想确定重复的行。我熟悉duplicated()和unique()。但是,这些只能找到精确的副本。因此,如果我有一行有3个值158,这就不会被认为是一行值18NA的重复 第一个问题是,如何找到重复的行而忽略NA/将NA视为通配符?理想情况下,我将创建这些重复行的组 以以下数据为例: df <- data.frame("x" = c(1,2,2,1,2,1,7,1),

我有一个或两个相关的问题

我有一个数据帧(行数>10.000,列数>100)。我想确定重复的行。我熟悉duplicated()和unique()。但是,这些只能找到精确的副本。因此,如果我有一行有3个值
158
,这就不会被认为是一行值
18NA
的重复

第一个问题是,如何找到重复的行而忽略NA/将NA视为通配符?理想情况下,我将创建这些重复行的组

以以下数据为例:

df <- data.frame("x" = c(1,2,2,1,2,1,7,1), 
                 "y"=c(5,3,3,NA,NA,5,8,5), 
                 "z" =  c(8,8,8,8,8,8,9,NA))

df  
  x  y  z  
---------
1 1  5  8  
2 2  3  8  
3 2  3  8  
4 1 NA  8  
5 2 NA  8  
6 1  5  8  
7 1  8  8  
8 1  5 NA  
我的第二个问题是,如何允许1个(或更多)不匹配?如果我允许1个潜在的不匹配,那么第7:18行将与第1:15行一起分组

因此,结果将是:

  x  y  z group
---------------
1 1  5  8     1
2 2  3  8     2
3 2  3  8     2
4 1 NA  8     1
5 1 NA  8     3
6 2 NA  8     2
7 1  5  8     1
8 1  8  8     3
9 1  5 NA     1
  x  y  z group
---------------
1 1  5  8     1
2 2  3  8     2
3 2  3  8     2
4 1 NA  8     1
5 1 NA  8     2
6 2 NA  8     1
7 2 NA  8     2
8 1  5  8     1
9 1  8  8     1
10 1  5 NA     1
我意识到这很快就会变得非常棘手,但我仍然希望你能在路上帮助我

ps我对tidyverse很熟悉,所以一个解决方案包括这也很好

您可以使用基本R函数完成所有这些操作
sum
all
可以使用
na.rm=TRUE
处理类似的事情:

vec1[1]错误
#计算不匹配,检查它们是否低于阈值
总和(vec1!=vec2,na.rm=TRUE)
#> [1] 0
总和(vec1!=vec3,na.rm=TRUE)
#> [1] 1
总和(vec1!=vec3,na.rm=TRUE)[1]真
由(v0.3.0)于2021年1月21日创建

请注意,在后一种情况下,计算不匹配并忽略
NA
s。要计算两者,您需要
sum(vec1!=vec3,is.na(vec1==vec3),na.rm=TRUE)

将每一行与另一行进行比较 您可以使用嵌套的
apply
将每一列与其他每一列进行比较,返回一个(功能上)三角形矩阵,该矩阵对匹配项进行索引

dfv1 v2 v4
#> 1  1  2  3  4
#>2 1 NA 3 4
#> 3  1  1  1  4
#>4不,不,不,不
#> 5  5  1  3  4
#> 6  1  2  8  4
应用(df,1,功能(x){
应用(df,1,功能(y){
和(x!=y,na.rm=TRUE)匹配矩阵
matchMatrix[upper.tri(matchMatrix)][,1][,2][,3][,4][,5][,6]
#>[1,]真的不知道
#>[2,]真的,真的,真的,真的
#>[3,]假-真-真-不-不-不-不
#>[4,]真的,真的,真的
#>[5,]假真假真NA
#>[6,]真假假假真

由(v0.3.0)于2021-01-28创建

谢谢。对于更大的数据帧,我该如何实现这一点?我想将每一行与其他每一行进行比较。理想情况下,我还需要一个匹配组的标识符?啊,好的。我已经更新了我的答案。“匹配组的标识符”很难定义。在我的示例中,col
v2
匹配其他每一列,但这些列不匹配t相互匹配。如果我们比较完全唯一的列,我们可以使用相同的列值来组成组。但在这里,这些规则无法应用。换句话说,在这个框架中,每个列都有自己的组,但有些列是组中唯一的列。我想您的示例实际上比较了列umns vs columns。但这只是将apply函数中的2更改为1的简单问题。当然,我非常喜欢这部分
sum(x!=y,na.rm=TRUE)啊。我将编辑示例