为什么 melt (reshape2) 用列序号替换列名?
Why does melt (reshape2) substitute column names by column order numbers?
我有一个 74x74 的 SNP 差异成对距离矩阵,其中第一列和第一行对应于分离株的编号,如下所示:
26482RR 25638 26230 25689RR 25954
26482RR 0 8 0 6 0
25638 8 0 8 14 8
26230 0 8 0 6 0
25689RR 6 14 6 0 6
25954 0 8 0 6 0
M = structure(c(0L, 8L, 0L, 6L, 0L, 8L, 0L, 8L, 14L, 8L, 0L, 8L,
0L, 6L, 0L, 6L, 14L, 6L, 0L, 6L, 0L, 8L, 0L, 6L, 0L), .Dim = c(5L,
5L), .Dimnames = list(c("26482RR", "25638", "26230", "25689RR",
"25954"), c("26482RR", "25638", "26230", "25689RR", "25954")))
我想将此矩阵转换为每对分离株的 table SNP 差异,如下所示:
Col Row SNP differences
26482RR 25638 8
26482RR 26230 0
26482RR 25689RR 6
26482RR 25954 0
25638 26230 8
25638 25689RR 14
25638 25954 8
...
为了绘制此数据并将其与其他矩阵相关联。我是 R 的初学者,所以经过一番搜索后,我决定应用以下代码:
st1076 <- read.csv("st1076.csv", header=TRUE, sep=";")
m1 <- as.matrix(st1076)
m1 <- m1[upper.tri(m1)] <- NA
m1_melted <- reshape2:::melt.matrix(m1, na.rm = TRUE)
colnames(m1_melted) <- c("Col","Row","SNP differences")
然而,通过这段代码,我在 "Col" 中得到了每个分离物按其出现顺序(1、2、3、4...)的编号,而不是各自的分离物编号:
Col Row SNP differences
2 X26482RR 8
3 X26482RR 0
4 X26482RR 6
从我在其他相关问题中看到的,使用melt.matrix
应该可以解决这个问题,但它对我不起作用。
谁能帮我理解为什么会这样?您对如何克服它有什么建议吗?
除了从 csv 读取之外,我认为您的代码是正确的。因为csvs被read.csv
解释为数据帧,需要一些处理才能得到矩阵:
DF = read.csv("st1076.csv", sep=";", row.names=1, check.names=FALSE)
M = as.matrix(DF)
res <- reshape2::melt(replace(M, upper.tri(M), NA),
varnames = c("Col", "Row"),
value.name = "SNP differences",
na.rm = TRUE
)
head(res)
Col Row SNP differences
1 26482RR 26482RR 0
2 25638 26482RR 8
3 26230 26482RR 0
4 25689RR 26482RR 6
5 25954 26482RR 0
6 25692 26482RR 2
作为参考,我从这个线程开始 https://stat.ethz.ch/pipermail/r-help/2010-May/237835.html 然后查阅了帮助文件 ?read.csv
我有一个 74x74 的 SNP 差异成对距离矩阵,其中第一列和第一行对应于分离株的编号,如下所示:
26482RR 25638 26230 25689RR 25954
26482RR 0 8 0 6 0
25638 8 0 8 14 8
26230 0 8 0 6 0
25689RR 6 14 6 0 6
25954 0 8 0 6 0
M = structure(c(0L, 8L, 0L, 6L, 0L, 8L, 0L, 8L, 14L, 8L, 0L, 8L,
0L, 6L, 0L, 6L, 14L, 6L, 0L, 6L, 0L, 8L, 0L, 6L, 0L), .Dim = c(5L,
5L), .Dimnames = list(c("26482RR", "25638", "26230", "25689RR",
"25954"), c("26482RR", "25638", "26230", "25689RR", "25954")))
我想将此矩阵转换为每对分离株的 table SNP 差异,如下所示:
Col Row SNP differences
26482RR 25638 8
26482RR 26230 0
26482RR 25689RR 6
26482RR 25954 0
25638 26230 8
25638 25689RR 14
25638 25954 8
...
为了绘制此数据并将其与其他矩阵相关联。我是 R 的初学者,所以经过一番搜索后,我决定应用以下代码:
st1076 <- read.csv("st1076.csv", header=TRUE, sep=";")
m1 <- as.matrix(st1076)
m1 <- m1[upper.tri(m1)] <- NA
m1_melted <- reshape2:::melt.matrix(m1, na.rm = TRUE)
colnames(m1_melted) <- c("Col","Row","SNP differences")
然而,通过这段代码,我在 "Col" 中得到了每个分离物按其出现顺序(1、2、3、4...)的编号,而不是各自的分离物编号:
Col Row SNP differences
2 X26482RR 8
3 X26482RR 0
4 X26482RR 6
从我在其他相关问题中看到的,使用melt.matrix
应该可以解决这个问题,但它对我不起作用。
谁能帮我理解为什么会这样?您对如何克服它有什么建议吗?
除了从 csv 读取之外,我认为您的代码是正确的。因为csvs被read.csv
解释为数据帧,需要一些处理才能得到矩阵:
DF = read.csv("st1076.csv", sep=";", row.names=1, check.names=FALSE)
M = as.matrix(DF)
res <- reshape2::melt(replace(M, upper.tri(M), NA),
varnames = c("Col", "Row"),
value.name = "SNP differences",
na.rm = TRUE
)
head(res)
Col Row SNP differences
1 26482RR 26482RR 0
2 25638 26482RR 8
3 26230 26482RR 0
4 25689RR 26482RR 6
5 25954 26482RR 0
6 25692 26482RR 2
作为参考,我从这个线程开始 https://stat.ethz.ch/pipermail/r-help/2010-May/237835.html 然后查阅了帮助文件 ?read.csv