You can use aggregate with paste for each of them and merge at the end:
x <- structure(list(SNP = structure(c(1L, 1L, 2L, 3L, 4L, 4L, 5L, 5L), .Label = c("chr1.111642529", "chr1.111801684", "chr1.111925084", "chr1.11801605", "chr1.151220354"), class = "factor"), hu_mRNA = structure(c(3L, 4L, 2L, 7L, 1L, 8L, 5L, 6L), .Label = c("AK027740", "BC098118", "NM_002107", "NM_005324", "NM_018913", "NM_018918", "NM_020435", "NM_032849"), class = "factor"), gene = structure(c(4L, 5L, 1L, 3L, 1L, 2L, 6L, 7L), .Label = c("<NA>", "C13orf33", "GJC2", "H3F3A", "H3F3B", "PCDHGA10", "PCDHGA5"), class = "factor")), .Names = c("SNP", "hu_mRNA", "gene"), class = "data.frame", row.names = c(NA, -8L )) a1 <- aggregate(hu_mRNA~SNP,data=x,paste,sep=",") a2 <- aggregate(gene~SNP,data=x,paste,sep=",") merge(a1,a2) SNP hu_mRNA gene 1 chr1.111642529 NM_002107, NM_005324 H3F3A, H3F3B 2 chr1.111801684 BC098118 <NA> 3 chr1.111925084 NM_020435 GJC2 4 chr1.11801605 AK027740, NM_032849 <NA>, C13orf33 5 chr1.151220354 NM_018913, NM_018918 PCDHGA10, PCDHGA5