Вы можете использовать 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