将来自不同行数的 tables 与主 MAP table 组合

Combining tables from different numbers of rows with a master MAP table

此数据集代表一个基因组图谱位置(chr 和 start)以及 20 个个体(dat)每个位置的测序覆盖率(深度)之和

示例:

gbsgre <- "chr start end depth
chr1 3273 3273 7
chr1 3274 3274 3
chr1 3275 3275 8
chr1 3276 3276 4
chr1 3277 3277 25"
gbsgre <- read.table(text=gbsgre, header=T)

此数据集表示一个基因组图谱位置(V1 加 V2),每个位置都有单独的覆盖率 (V3)。

示例:

df1 <- "chr start depth
        chr1 3273 4
        chr1 3276 4
        chr1 3277 15"
df1 <- read.table(text=df1, header=T)

df2 <- "chr start depth
        chr1 3273 3
        chr1 3274 3
        chr1 3275 8
        chr1 3277 10"

df2 <- read.table(text=df2, header=T)

dat <- NULL

dat[[1]] <- df1
dat[[2]] <- df2

> dat
[[1]]
   chr start depth
1 chr1  3273     4
2 chr1  3276     4
3 chr1  3277    15

[[2]]
   chr start depth
1 chr1  3273     3
2 chr1  3274     3
3 chr1  3275     8
4 chr1  3277    10

根据chrstartgbsgre的位置,我需要穿越每20只动物的所有20个深度(V3)([[1]]到[ [20]]) 到 main table (gbsgre) 生成最终的 table 如下: 第一列是染色体位置(V1),第二列(V2)是起始位置,第三列是“gbsgre”数据集的深度(V3),第四列(V4)是深度(dat/V3) 来自“dat”的[[1]],依此类推,直到第 24 列,这将是“dat”数据集上 [[20]] 的深度。 但非常重要的一点是,这 20 个人的缺失数据应该被视为零(“0”)。 最后table的数量应该和“gbsgre”一样。

#Example Result
> GBSMeDIP
chr start   depth   depth1  depth2
1: chr1 3273    7   4   3
2: chr1 3274    3   0   3 
3: chr1 3275    8   0   8 
4: chr1 3276    4   4   0 
5: chr1 3277    25  15  10

这应该可以解决问题:

 for(k in 1:length(dat)){
  datx <- dat[[k]]
  datx$tag <- paste0(datx$chr, "-", datx$start)
  if(k==1){
  datall <- datx
  colnames(datall)[3] <- paste0("depth", k)
  }
  if(k>1){
    colnames(datx)[3] <- paste0("depth", k)
    datx <- datx[, -c(1:2)]
    datall <- merge(datall, datx, by="tag", all.y=TRUE, all.x=TRUE) 
  }
}
library(stringr)
nam <- str_split_fixed(datall$tag, "-", 2)
datall <- cbind(nam, datall) 
datall <- datall[, -c(3:5)]
colnames(datall)[1:2] <- c("chr", "start")
datall[is.na(datall)] <- 0

这给你:

   > datall
   chr start depth1 depth2
1 chr1  3273      4      3
2 chr1  3274      0      3
3 chr1  3275      0      8
4 chr1  3276      4      0
5 chr1  3277     15     10

使用data.table:

# set names to your list `dat` first
setattr(dat, 'names', paste0("depth", seq_along(dat)))
# bind them by rows and reshape to wide form
dcast(rbindlist(dat, idcol="id"), chr + start ~ id, fill=0L)
#     chr start depth1 depth2
# 1: chr1  3273      4      3
# 2: chr1  3274      0      3
# 3: chr1  3275      0      8
# 4: chr1  3276      4      0
# 5: chr1  3277     15     10