将来自不同行数的 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
根据chr
和start
在gbsgre
的位置,我需要穿越每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
此数据集代表一个基因组图谱位置(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
根据chr
和start
在gbsgre
的位置,我需要穿越每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