删除R中矩阵的反转

时间:2014-11-13 05:57:37

标签: r matrix

我最初有一个矩阵,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]) :

为什么我收到此错误? 有没有更好的方法来找到倒置?

3 个答案:

答案 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)

目前尚不清楚值的顺序在最终输出中是否重要,但也许您可以使用pminpmax

这是在&#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])

应该返回要删除的行。不需要进行第二轮检查。你可以删除返回的行。