我有一个看起来像这样的矩阵
aaa = matrix(c(1,1,7,9,2,5,8,9,1,2,3,7),nrow=3,ncol=4)
现在我需要为每一行找到与前一行不同的数字(不管行中的顺序如何)。因此,例如,第1行和第2行中的不同数字将是8和3.输出必须是列表。代码需要如何进行这样的练习?
感谢您的帮助。
答案 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解决方案,但使用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 :(得分: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