[英]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.