如何按数据框或矩阵中的不同行进行子集化?
How to subset by distinct rows in a data frame or matrix?
假设我有以下矩阵:
matrix(c(1,1,2,1,2,3,2,1,3,2,2,1),ncol=3)
结果:
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 3 2
[3,] 2 2 2
[4,] 1 1 1
如何根据每行是否有重复值来 filter/subset 这个矩阵?例如,在这种情况下,我只想保留第 1 行和第 2 行。
如有任何想法,我们将不胜感激!
indx <- apply(m, 1, function(x) !any(duplicated(x)))
m[indx, ]
# [,1] [,2] [,3]
#[1,] 1 2 3
#[2,] 1 3 2
第二个只是为了好玩。你可以按照逻辑看看它为什么有效。
indx2 <- apply(m, 1, function(x) length(unique(x)) == length(x))
m[indx2,]
# [,1] [,2] [,3]
#[1,] 1 2 3
#[2,] 1 3 2
这是我的方法,使用 anyDuplicated
函数稍微短一点,应该更快。
mat[!apply(mat, 1, anyDuplicated), ]
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 3 2
试试这个:(我怀疑会比任何 apply
方法都快)
mat[ rowSums(mat == mat[,1])!=ncol(mat) , ]
# ---with your object---
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 3 2
假设我有以下矩阵:
matrix(c(1,1,2,1,2,3,2,1,3,2,2,1),ncol=3)
结果:
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 3 2
[3,] 2 2 2
[4,] 1 1 1
如何根据每行是否有重复值来 filter/subset 这个矩阵?例如,在这种情况下,我只想保留第 1 行和第 2 行。
如有任何想法,我们将不胜感激!
indx <- apply(m, 1, function(x) !any(duplicated(x)))
m[indx, ]
# [,1] [,2] [,3]
#[1,] 1 2 3
#[2,] 1 3 2
第二个只是为了好玩。你可以按照逻辑看看它为什么有效。
indx2 <- apply(m, 1, function(x) length(unique(x)) == length(x))
m[indx2,]
# [,1] [,2] [,3]
#[1,] 1 2 3
#[2,] 1 3 2
这是我的方法,使用 anyDuplicated
函数稍微短一点,应该更快。
mat[!apply(mat, 1, anyDuplicated), ]
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 3 2
试试这个:(我怀疑会比任何 apply
方法都快)
mat[ rowSums(mat == mat[,1])!=ncol(mat) , ]
# ---with your object---
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 3 2