R矩阵行的比较

时间:2014-09-23 13:22:37

标签: r matrix

我有一个看起来像这样的矩阵

aaa = matrix(c(1,1,7,9,2,5,8,9,1,2,3,7),nrow=3,ncol=4)

现在我需要为每一行找到与前一行不同的数字(不管行中的顺序如何)。因此,例如,第1行和第2行中的不同数字将是8和3.输出必须是列表。代码需要如何进行这样的练习?

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

这是一个基于两个setdiff()操作的组合执行此操作的函数:

foo <- function(x, y)c(setdiff(x, y), setdiff(y, x))
foo(aaa[1, ], aaa[2, ])

[1] 8 3

应用于您的矩阵:

lapply(1:(nrow(aaa)-1), function(i)foo(aaa[i, ], aaa[i+1, ]))

[[1]]
[1] 8 3

[[2]]
[1] 2 9 3 7 5

答案 1 :(得分:1)

类似于akrun的lapply解决方案,但使用unionsetdiff

lapply(1:(nrow(aaa)-1), function(x) {union(setdiff(aaa[x,], aaa[x+1,]), setdiff(aaa[x+1,], aaa[x,]))})

[[1]]
[1] 8 3

[[2]]
[1] 2 9 3 7 5

答案 2 :(得分:0)

似乎你想要联合和两个连续行的值的交集之间的集合差异。试试这个:

    ret<-vector("list",nrow(aaa)-1)
    for (i in 1:length(ret)) ret[[i]]<-setdiff(union(aaa[i,],aaa[i+1,]),intersect(aaa[i,],aaa[i+1,]))
    ret

答案 3 :(得分:0)

您也可以尝试:

fun1 <- function(mat){
Pdat <- as.data.frame(t(mat[-nrow(mat),]))
Cdat <- as.data.frame(t(mat[-1,]))
foo <- function(x,y) {z <- c(x,y)
                  unique(z[!z %in% intersect(x,y)])} 
setNames(Map(foo, Pdat, Cdat), NULL)
 }       


 fun1(aaa)
 #[[1]]
 #[1] 8 3

 #[[2]]
 #[1] 2 9 3 7 5

答案 4 :(得分:0)

尝试:

a=1; b=2
ll = list()
llnum = 1
while(TRUE) {
    ll[[llnum]]=unique(aaa[a,!(aaa[a,] %in% aaa[b,])])
    ll[[llnum+1]]=unique(aaa[b,!(aaa[b,] %in% aaa[a,])])
    llnum = llnum+2
    a=a+1; b=b+1;
    if(b>nrow(aaa)) break;
}

ll
[[1]]
[1] 8

[[2]]
[1] 3

[[3]]
[1] 2 9 3

[[4]]
[1] 7 5