在两列或三列中查找包含相同值的行
Find rows that contain the same values across two or three columns
我想查找在两列或三列中包含相同值的行。这是一个示例数据集:
replicate(3, {sample(1:3)})
[,1] [,2] [,3]
[1,] 3 3 2
[2,] 2 1 1
[3,] 1 2 3
对于此数据集,第一行和第二行具有重复值(即 3 和 1),因此我想提取并处理它们,稍后只保留具有非重复值的行(即本例中为第三行)。
如何实现?我有一个更大的数据集。感谢您的帮助!
给你
dataf<- replicate(3, {sample(1:3)})
dup_rows<-apply(dataf,1,FUN=function(x) ifelse( max(table(x) )>1 ,TRUE, FALSE) )
data_non_dup<-dataf[!dup_rows,]
在末尾的注释中使用 m,将 anyDuplicated 应用于每一行并使用它来对行进行子集化。 anyDupolicated returns 如果没有重复项则为 0,否则为第一个重复项的索引。感叹号 (!) 会将 0 强制为 FALSE,将其他值强制为 TRUE,然后取反。
m[!apply(m, 1, anyDuplicated),, drop = FALSE ]
## [,1] [,2] [,3]
## [1,] 1 2 3
或
subset(m, !apply(m, 1, anyDuplicated))
## [,1] [,2] [,3]
## [1,] 1 2 3
备注
这与问题中显示的矩阵相同,但生成时未使用随机数来实现再现性。
m <- matrix(c(3, 2, 1, 3, 1, 2, 2, 1, 3), 3)
如果您有兴趣,这里有一个 tidyverse 解决方案:
library(dplyr)
library(purrr)
[,1] [,2] [,3]
[1,] 1 3 2
[2,] 3 1 3
[3,] 2 2 1
df %>%
as_tibble() %>%
mutate(dup = pmap_dbl(list(V1, V2, V3), ~ n_distinct(c(...)))) %>%
filter(dup == 3) %>%
select(-dup)
# A tibble: 1 x 3
V1 V2 V3
<int> <int> <int>
1 1 3 2
我想查找在两列或三列中包含相同值的行。这是一个示例数据集:
replicate(3, {sample(1:3)})
[,1] [,2] [,3]
[1,] 3 3 2
[2,] 2 1 1
[3,] 1 2 3
对于此数据集,第一行和第二行具有重复值(即 3 和 1),因此我想提取并处理它们,稍后只保留具有非重复值的行(即本例中为第三行)。
如何实现?我有一个更大的数据集。感谢您的帮助!
给你
dataf<- replicate(3, {sample(1:3)})
dup_rows<-apply(dataf,1,FUN=function(x) ifelse( max(table(x) )>1 ,TRUE, FALSE) )
data_non_dup<-dataf[!dup_rows,]
在末尾的注释中使用 m,将 anyDuplicated 应用于每一行并使用它来对行进行子集化。 anyDupolicated returns 如果没有重复项则为 0,否则为第一个重复项的索引。感叹号 (!) 会将 0 强制为 FALSE,将其他值强制为 TRUE,然后取反。
m[!apply(m, 1, anyDuplicated),, drop = FALSE ]
## [,1] [,2] [,3]
## [1,] 1 2 3
或
subset(m, !apply(m, 1, anyDuplicated))
## [,1] [,2] [,3]
## [1,] 1 2 3
备注
这与问题中显示的矩阵相同,但生成时未使用随机数来实现再现性。
m <- matrix(c(3, 2, 1, 3, 1, 2, 2, 1, 3), 3)
如果您有兴趣,这里有一个 tidyverse 解决方案:
library(dplyr)
library(purrr)
[,1] [,2] [,3]
[1,] 1 3 2
[2,] 3 1 3
[3,] 2 2 1
df %>%
as_tibble() %>%
mutate(dup = pmap_dbl(list(V1, V2, V3), ~ n_distinct(c(...)))) %>%
filter(dup == 3) %>%
select(-dup)
# A tibble: 1 x 3
V1 V2 V3
<int> <int> <int>
1 1 3 2