R 识别允许x不匹配且忽略NA的重复行
我有一个或两个相关的问题 我有一个数据帧(行数>10.000,列数>100)。我想确定重复的行。我熟悉duplicated()和unique()。但是,这些只能找到精确的副本。因此,如果我有一行有3个值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),
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)啊。我将编辑示例