Преобразовать все значения в одном столбце в строку, соответствующую другому значению в другом столбце - PullRequest
0 голосов
/ 23 марта 2020

У меня есть кадр данных со всеми GeneID, которые соответствуют каждому пути KEGG . Я хочу преобразовать GeneID в строку, разделенную точкой с запятой, для каждого пути KEGG, чтобы у меня был кадр данных, состоящий из двух столбцов, причем первый столбец представляет собой все уникальные идентификаторы пути KEGG, а другой содержит строки GeneIds, соответствующие каждый PathwayID.

(для первого значения, первого столбца) путь: mmu00010 и (для первого значения, второго столбца) "103988; 106557; 110695; 11522 ...." et c

1 Ответ

1 голос
/ 23 марта 2020

Вы можете использовать aggregate для группировки идентификаторов пути по идентификатору гена. После этого используйте paste в apply до collapse строках и разделяйте их точкой с запятой.

dat2 <- do.call(data.frame, aggregate(path.id ~ gene.id, dat, gsub, pattern="\\D",
          replacement=""))
dat2 <- transform(dat2,
                 string=apply(da2t[-1], 1, paste, collapse=";"))[-(2:4)]
dat2
#   gene.id            string
# 1      10 00010;00020;00030
# 2      11 00010;00020;00030
# 3      12 00010;00020;00030
# 4      13 00010;00020;00030
# 5      14 00010;00020;00030
# 6      15 00010;00020;00030

Вы также можете сделать это за один шаг, если не возражаете, что получится немного do.call y.

dat3 <- do.call(data.frame, aggregate(path.id ~ gene.id, dat, function(x) 
  do.call(paste, c(as.list(gsub("\\D", "", x)), sep = ";"))))
dat3
#   gene.id           path.id
# 1      10 00010;00020;00030
# 2      11 00010;00020;00030
# 3      12 00010;00020;00030
# 4      13 00010;00020;00030
# 5      14 00010;00020;00030
# 6      15 00010;00020;00030

Игрушечные данные

dat <- structure(list(gene.id = c(10L, 11L, 12L, 13L, 14L, 15L, 10L, 
11L, 12L, 13L, 14L, 15L, 10L, 11L, 12L, 13L, 14L, 15L), path.id = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L), .Label = c("path:mmu00010", "path:mmu00020", "path:mmu00030"
), class = "factor")), out.attrs = list(dim = c(gene.id = 6L, 
path.id = 3L), dimnames = list(gene.id = c("gene.id=10", "gene.id=11", 
"gene.id=12", "gene.id=13", "gene.id=14", "gene.id=15"), path.id = c("path.id=path:mmu00010", 
"path.id=path:mmu00020", "path.id=path:mmu00030"))), class = "data.frame", row.names = c(NA, 
-18L))

head(dat)
#   gene.id       path.id
# 1      10 path:mmu00010
# 2      11 path:mmu00010
# 3      12 path:mmu00010
# 4      13 path:mmu00010
# 5      14 path:mmu00010
# 6      15 path:mmu00010
...