我需要折叠一个大表(V19,5M),在其中删除基于特定列(V1)的重复项,合并所有其他列的值(如果唯一的话)(如果不是,则只报告一次结果)。 / p>
我从这里尝试了一些解决方案,但是这些示例大部分是在2个变量上执行的-我有19个。最终发生的事情是,表的其余部分都合并在一个数字列表列中。
输入:
V1 V2 V3 V4 V5 V6
TR1000 chr1 1000 1200 A +
TR1000 chr1 1000 1200 B +
TR1000 chr1 1000 1200 C +
TR2000 chr2 2000 2500 D +
TR2000 chr2 2000 2500 E +
TR3000 chr3 3000 3500 F +
我需要:
V1 V2 V3 V4 V5 V6
TR1000 chr1 1000 1200 A, B, C +
TR2000 chr2 2000 2500 D, E +
TR3000 chr3 3000 3500 F +
答案 0 :(得分:0)
使用dplyr
的解决方案。
library(dplyr)
dat2 <- dat %>%
group_by_at(vars(-V5)) %>%
summarize(V5 = toString(V5)) %>%
ungroup() %>%
select(names(dat))
dat2
# # A tibble: 3 x 6
# V1 V2 V3 V4 V5 V6
# <chr> <chr> <int> <int> <chr> <chr>
# 1 TR1000 chr1 1000 1200 A, B, C +
# 2 TR2000 chr2 2000 2500 D, E +
# 3 TR3000 chr3 3000 3500 F +
数据
dat <- read.table(text = "V1 V2 V3 V4 V5 V6
TR1000 chr1 1000 1200 A +
TR1000 chr1 1000 1200 B +
TR1000 chr1 1000 1200 C +
TR2000 chr2 2000 2500 D +
TR2000 chr2 2000 2500 E +
TR3000 chr3 3000 3500 F + ",
header = TRUE, stringsAsFactors = FALSE)
答案 1 :(得分:0)
一个data.table
选项:
library(data.table)
setDT(dat)
byCols <- setdiff(names(dat), "V5")
dat[, .(v5 = toString(V5)), by = byCols]
V1 V2 V3 V4 V6 v5
1: TR1000 chr1 1000 1200 + A, B, C
2: TR2000 chr2 2000 2500 + D, E
3: TR3000 chr3 3000 3500 + F