在两列或三列中查找包含相同值的行

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