找到互逆行重复

时间:2014-11-20 17:07:04

标签: r list

(请随意将标题更改为更合适的名称)

我想从非对称方阵中提取所有倒数对。

要澄清的一些虚拟数据:

m <- matrix(c(NA,0,1,0,0,-1,NA,1,-1,0,1,1,NA,-1,-1,-1,1,0,NA,0,-1,1,0,0,NA), ncol=5, nrow=5)
colnames(m) <- letters[seq(ncol(m))]
rownames(m) <- letters[seq(nrow(m))]

require(reshape2)
m.m <- melt(m)  # get all pairs
m.m <- m.m[complete.cases(m.m),]  # remove NAs

我现在如何从m.m(或直接从m)提取所有“互惠副本”?

我的意思是互惠副本:

Var1 Var2 value
   b    a    0
   a    b   -1

我想将每个值组合,即{1,1},{-1,-1},{1,0},{-1,0},{0,0}存储在列表中,其中Var组合{a,b},{a,c},{a,d},{a,e},{b,c},{b,d},{b,e},{c,d},{c,e},{d,e}指向它,类似

$`a,b`
[1] 0,-1

我无法解决这个问题。感觉可以使用merge()inner_join。另外,我为没有提供最好的例子而道歉。

任何指针都会受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

这是一种基于对象m.m的方法:

# extract the unique combinations
levs <- apply(m.m[-3], 1, function(x) paste(sort(x), collapse = ","))

# create a list of values for these combinations
split(m.m$value, levs)

答案 1 :(得分:1)

使用矩阵表示法,您可以使用以下方法获取矩阵的每个三角形的矢量(根据需要对齐):

m[upper.tri(m)]
t(m)[upper.tri(m)]

命名:

nm <- matrix(paste("(",rep(rownames(m),times=nrow(m)), ",",rep(rownames(m),each=nrow(m)),")",sep=""), nrow=nrow(m))
nm[as.vector(upper.tri(m))]

最后根据需要转换为列表。首先,我将它们放入一个新的2 x 10矩阵中。然后我使用lapply来创建列表结构。

pairs<- cbind(m[upper.tri(m)], t(m)[upper.tri(m)] )
rownames(pairs) <- nm[as.vector(upper.tri(m))]
pairs

m.list <- lapply(seq_len(nrow(pairs)),function(i) pairs[i,])
names(m.list) <- rownames(pairs)
m.list