繁体   English   中英

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

[英]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),因此我想提取并处理它们,然后只保留具有非重复值的行(即在这种情况下为第三行)。

如何做到这一点? 我有一个更大的数据集。 感谢您的帮助!

在最后的注释中使用 m ,将 anyDuplicated 应用于每一行并使用它来对行进行子集化。 如果没有重复项,则 anyDupolicated 返回 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)

给你 go

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,]

如果您有兴趣,这是一个 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM