2014-09-23 2 views
1

У меня есть матрица, которая выглядит как этотR Сравнение строк матрицы

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

Теперь мне нужно найти для каждой строки с номером (ами), которые отличаются от предыдущего ряда (независимо от заказа в строке). Так, например, разные числа из строк 1 и 2 будут равны 8 и 3. Выход должен быть списком. Как код должен быть для такого упражнения?

Благодарим за помощь.

+2

может быть 'lapply (1: (nrow (ааа) -1), функция (я) {a1 <- rbind (aaa [i,], aaa [i + 1,]); unique (a1 [! a1% in% intersect (a1 [1,], a1 [2,])])}) ' – akrun

ответ

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 
+0

Благодаря всем решениям работают – user2157086

1

lapply раствор, подобный akrun, но с использованием union и setdiff:

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

Вот функция, которая делает это, основываясь на комбинации двух 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 
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 
0

Try:

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 
Смежные вопросы