R 如何拆分成对矩阵?
我有以下格式的矩阵R 如何拆分成对矩阵?,r,R,我有以下格式的矩阵 gene ids A-B A-C A-D B-C B-D C-D GENE1 0 0 1 1 1 0 GENE2 1 0 1 1 1 1 GENE3 1 0 0 0 1 1 GENE4 0 1 0 0 0 0 并将其拆分如下:对角线值将为空,因为上面的
gene ids A-B A-C A-D B-C B-D C-D
GENE1 0 0 1 1 1 0
GENE2 1 0 1 1 1 1
GENE3 1 0 0 0 1 1
GENE4 0 1 0 0 0 0
并将其拆分如下:对角线值将为空,因为上面的矩阵是成对比较
Gene1
A B C D sum
A - 0 0 1 1
B 0 - 1 1 2
C 0 1 - 0 1
D 1 1 0 - 2
Gene2
A B C D sum
A - 1 0 1 2
B 1 - 1 1 3
C 0 1 - 1 2
D 1 1 1 - 3
Gene3
A B C D sum
A - 1 0 0 1
B 1 - 0 1 2
C 0 0 - 1 1
D 0 1 1 - 2
Gene4
A B C D sum
A - 0 1 0 1
B 0 - 0 0 0
C 1 0 - 0 1
D 0 0 0 - 0
这只是数据的一个子集,我有1000多个基因要以类似的方式分裂。我试着用下三角的转座来填充上三角,但在对许多基因进行同样的操作时没有成功。在将整个矩阵拆分为不同的子矩阵后,我想逐行求和,并为每个基因获得相同的图
下面提供的解决方案不适用于更多的数字比较:
例如:
DF <- read.table(text="gene_ids A-B A-C A-D A-E B-C B-D B-E C-D C-E D-E
GENE1 0 0 1 1 1 0 1 0 1 1
GENE2 1 0 1 1 1 1 0 1 1 0
GENE3 1 0 0 0 1 1 0 1 0 1
GENE4 0 1 0 0 0 0 1 1 1 0
GENE5 1 1 0 0 0 0 0 1 1 1
GENE6 0 1 1 0 0 1 0 0 0 0", header=TRUE)
在RowB中,D列的值不是它应该的值(它必须是零),矩阵不再是对称的…所以在大多数基因中,最终都会有错误
DF我假设,列的顺序始终与您的问题中的顺序相同?实际上,列的顺序并不相同,而且往往会发生变化。在运行循环之前,只需按照colname的字母顺序排列列(第一列除外)。再次修复此问题。现在应该可以正常工作了。@Roland:工作得很好!是否也可以包含像[,A][,B][,C]这样的标题名,而不是[,1][,2][,3]??@user2294316请参见我的编辑。@罗兰:但一旦我包含了更多的比较,它似乎就不起作用了:例如,我尝试了这个dataDF@Roland:我是否应该报告使用多个Comaprison时得到的结果?我不知道哪里出了问题@user2294316我稍后再看。我现在在工作。
DF <- read.table(text="gene_ids A-B A-C A-D A-E B-C B-D B-E C-D C-E D-E
GENE1 0 0 1 1 1 0 1 0 1 1
GENE2 1 0 1 1 1 1 0 1 1 0
GENE3 1 0 0 0 1 1 0 1 0 1
GENE4 0 1 0 0 0 0 1 1 1 0
GENE5 1 1 0 0 0 0 0 1 1 1
GENE6 0 1 1 0 0 1 0 0 0 0", header=TRUE)
m_temp <- matrix(NA,ncol=5,nrow=5)
up <- upper.tri(m_temp)
lo <- lower.tri(m_temp)
lapply(seq_len(nrow(DF)), function(i, res) {
tmpnames <- do.call(rbind,strsplit(names(unlist(DF[i, -1])),"\\."))
#possibly you need to adjust the seperator here
rownames(res) <- c(tmpnames[1,1],tmpnames[tmpnames[,1]==tmpnames[1,1],2])
res[lo] <- unlist(DF[i, -1])
res[up] <- t(res)[up]
res <- cbind(res, rowSums(res, na.rm = TRUE))
colnames(res) <- c(rownames(res),"sum")
res
}, res = m_temp)
# [[1]]
# A B C D E sum
# A NA 0 0 1 1 2
# B 0 NA 1 0 1 2
# C 0 1 NA 0 1 2
# D 1 0 0 NA 1 2
# E 1 1 1 1 NA 4
DF <- read.table(text="gene_ids A-B A-C A-D A-E B-C B-D B-E C-D C-E D-E
GENE1 0 0 1 1 1 0 1 0 1 1
GENE2 1 0 1 1 1 1 0 1 1 0
GENE3 1 0 0 0 1 1 0 1 0 1
GENE4 0 1 0 0 0 0 1 1 1 0
GENE5 1 1 0 0 0 0 0 1 1 1
GENE6 0 1 1 0 0 1 0 0 0 0", header=TRUE)
m_temp <- matrix(NA,ncol=5,nrow=5)
up <- upper.tri(m_temp)
lo <- lower.tri(m_temp)
lapply(seq_len(nrow(DF)), function(i, res) {
tmpnames <- do.call(rbind,strsplit(names(unlist(DF[i, -1])),"\\."))
#possibly you need to adjust the seperator here
rownames(res) <- c(tmpnames[1,1],tmpnames[tmpnames[,1]==tmpnames[1,1],2])
res[lo] <- unlist(DF[i, -1])
res[up] <- t(res)[up]
res <- cbind(res, rowSums(res, na.rm = TRUE))
colnames(res) <- c(rownames(res),"sum")
res
}, res = m_temp)
# [[1]]
# A B C D E sum
# A NA 0 0 1 1 2
# B 0 NA 1 0 1 2
# C 0 1 NA 0 1 2
# D 1 0 0 NA 1 2
# E 1 1 1 1 NA 4