(请随意将标题更改为更合适的名称)
我想从非对称方阵中提取所有倒数对。
要澄清的一些虚拟数据:
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
。另外,我为没有提供最好的例子而道歉。
任何指针都会受到高度赞赏。
答案 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