我最初有一个矩阵,p:
# p is a matrix
p
A B
[1,] 1 1
[2,] 2 3
[3,] 3 2
[4,] 1 1
[5,] 8 2
对于给定的矩阵,我想遍历行并删除任何反转。所以新矩阵是:
p
A B
[1,] 1 1
[2,] 2 3
[3,] 8 2
这就是我得到的:
p<-unique(p) # gets rid of duplicates
output<-lapply(p, function(x){
check<-which(p$A[x,] %in% p$B[x,])#is the value in row x of column A found in
#column B if so return the row number it was found in column B
if (length(check)!=0 ){
if(p$A[check,]== p$B[x]){ # now check if at the found row (check)of p$A is equal to p$B[x]
p<-p[-check,] #if so remove that inverse
}
}
}
)
我收到此消息Error in which(p$A[x] %in% p$B[x]) :
为什么我收到此错误? 有没有更好的方法来找到倒置?
答案 0 :(得分:1)
尝试
p <- unique(p)
p[!duplicated(apply(p, 1, function(x) paste(sort(x), collapse=''))),]
# A B
#[1,] 1 1
#[2,] 2 3
#[3,] 8 2
p <- matrix(c(1,2,3,1,8, 1,3,2,1,2),
dimnames=list(NULL, c("A", "B")), ncol=2)
答案 1 :(得分:1)
目前尚不清楚值的顺序在最终输出中是否重要,但也许您可以使用pmin
和pmax
。
这是在&#34; data.table&#34;中使用这些功能的方法:
library(data.table)
unique(as.data.table(p)[, list(A = pmin(A, B), B = pmax(A, B))])
# A B
# 1: 1 1
# 2: 2 3
# 3: 2 8
答案 2 :(得分:0)
这个问题有点不清楚。我假设您要根据您的示例删除包含&#34; 3 2&#34;的行。因为第一个值出现在第二列(在不同的行中)。在那种情况下
check <- which(p[,1] %in% p[,2])
应该返回要删除的行。不需要进行第二轮检查。你可以删除返回的行。