#r #matrix #reshape2 #melt
#r #матрица #reshape2 #melt
Вопрос:
У меня есть матрица попарных расстояний 74×74 различий 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")))
Я хотел бы преобразовать эту матрицу в таблицу различий 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
должно решить эту проблему, но у меня это не сработало.
Кто-нибудь может помочь мне понять, почему это произошло? У вас есть какие-либо предложения о том, как это преодолеть?
Комментарии:
1. Я не могу воспроизвести, начиная с вашего csv, но с M, который я отредактировал в (который, кажется, соответствует вашему дисплею),
melt(replace(M, upper.tri(M), NA), varnames = c("Col", "Row"), value.name="SNP differences", na.rm=TRUE)
работает ..? Я думаю, может быть, вы каким-то образом переплавляете data.frame.2. @Frank вот мой файл .csv: ( 1drv.ms/u/s ! AKyGaGVVl6bDgkw ), не могли бы вы, пожалуйста, взглянуть. Я проверил выходные данные каждого шага, и я все еще не могу расшифровать проблему, кажется, все в порядке.
3. Я забыл упомянуть ранее, но первая часть итоговой выходной таблицы была примерно такой: Col: 1, Row: X, SNP различия: 26482RR, для первых 74 записей. Я думал, что мог бы просто удалить эти первые записи, но, возможно, они связаны с проблемой.
4. Хорошо, думаю, я понял. Вы можете подтвердить, что
st1076
приведенный выше код не является хорошим представлением матрицы, посколькуdim(st1076)
не имеет размера 74×74. Ниже я показал лучший способ прочитать это в
Ответ №1:
Я думаю, что ваш код был правильным, за исключением чтения из csv. Поскольку CSV интерпретируются как фреймы данных 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