Почему melt (reshape2) заменяет имена столбцов порядковыми номерами столбцов? - PullRequest
2 голосов
/ 13 марта 2019

У меня есть матрица парных расстояний 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")))

Я хотел бы преобразовать эту матрицу в таблицу 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 Ответ

1 голос
/ 14 марта 2019

Я думаю, что ваш код был правильным, кроме чтения из 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...