Почему melt (reshape2) заменяет имена столбцов порядковыми номерами столбцов?

#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