Преобразование из попарной матрицы в таблицу ребер Cytoscape происходит слишком медленно - PullRequest
2 голосов
/ 08 марта 2019

Мой код похож на this . Учитывая матрицу как это:

  a  b  c  d
a 1  NA 3  4
b NA 2  NA 4
c NA NA NA NA
d NA NA NA 4

Преобразует это в:

a  a  1
a  c  3
a  d  4
b  b  2
b  d  4
d  d  4

Соответствующий код указан ниже:

  2 pears <- read.delim("pears.txt", header = TRUE, sep = "\t", dec = ".")
  3 edges <- NULL
  4 for (i in 1:nrow(pears)) {
  5         for (j in 1:ncol(pears)) {
  6                 if (!(is.na(pears[i,j]))) {
  7                         edges <- rbind(edges, c(rownames(pears)[i], colnames(pears)[j], pears[i,j]))
  8                 }
  9         }
 10         print(i)
 11 }
 12 colnames(edges) <- c("gene1", "gene2", "PCC")
 13 write.table(edges, "edges.txt", row.names = FALSE, quote = FALSE, sep = "\t")

Когда я запускаю код с удаленного сервера в фоновом режиме, используя screen -S в разреженной (99% NA) матрице 17804x17804, он первоначально выполняет 5 операторов печати каждые 13 секунд. Тем не менее, теперь она замедлилась до 7 печатных выражений каждую минуту. Почему алгоритм становится все медленнее и медленнее? Есть ли другой способ быстрее конвертировать мою матрицу в формат Cytoscape?

1 Ответ

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

Мы конвертируем data.frame в matrix, используем melt из reshape2, чтобы получить имена в виде двух столбцов вместе со значениями в третьем столбце, затем subset при использовании na.rm для удаления NA строки

library(reshape2)
melt(as.matrix(df1), na.rm = TRUE)

данные

df1 <- structure(list(a = c(1L, NA, NA, NA), b = c(NA, 2L, NA, NA), 
c = c(3L, NA, NA, NA), d = c(4L, 4L, NA, 4L)), class = "data.frame", 
  row.names = c("a", 
  "b", "c", "d"))
...