无法按相应列表

时间:2016-12-21 18:38:32

标签: r subset

我试图从染色体/位置数据框中提取区域,该区域对应于描绘组蛋白位置的相关染色体位置列表。我目前的管道":

导入包含染色体和位置的原始数据集:

> mapinfo<- read.table()
> colnames(mapinfo)<-c("CHR","M")
> mapinfo$CHR<- paste("chr",mapinfo$CHR),sep="")
> head(mapinfo)
CHR         M
1  chrX  24072640
2  chr9 131463936
3 chr14 105176736
4 chr13 115000168
5  chr8  74791285
6 chr19   3676340

导入包含组蛋白位置的床文件

> bed<-read.table()
> names(bed)<- c("Chr","Start","Stop")
> head(bed)
Chr     Start      Stop
1  chr4  76806896  76807598
2  chrY  10034763  10036639
3  chr2 133036421 133037716
4 chr21  27227897  27228500
5  chr1 145036931 145041607
6  chr2  91777964  91779762

生成染色体特定代码,用于从mapinfo数据框

进行子集化
> Mcodes<- by(bed,bed$Chr,function(x){paste("M>=",bed$Start,"&M<=",bed$Stop,sep="",collapse="|")})
> Mcodes[chr1]
chr1
"M>=130786932&M<=130787255|M>=133156512&M<=133156894..."

通过染色体子集原始mapinfo数据集:

> subs<- split(mapinfo,mapinfo$CHR)

此时我可以使用以下行,以便通过染色体单独对所需区域进行子集化:

> CHR1<- eval(parse(text=paste0('subset(subs$chr1,',Mcodes["chr1"],')')))

我想将&#34; subs&#34;中包含的所有染色体特定数据框子集。通过他们的染色体特定对应列表在&#34; Mcodes&#34;无需在24个不同时间运行最后一行代码(因为我有多个床文件用于各种组蛋白/组蛋白变体,最终需要通过相同的管道)。有没有办法循环/应用/使某些事情成为可能?

对不起,如果这似乎是一个微不足道的问题 - 我仍然是R /编程游戏的新手。 谢谢你的任何建议。

1 个答案:

答案 0 :(得分:1)

这是一个玩具示例,如果我理解正确的话,应该有所帮助:

这是一个玩具mapinfo

mapinfo <- data.frame(
  CHR = paste0("chr", rep(1:3, each = 3)),
  M   = c(1, 10, 100)
)
mapinfo
#>    CHR   M
#> 1 chr1   1
#> 2 chr1  10
#> 3 chr1 100
#> 4 chr2   1
#> 5 chr2  10
#> 6 chr2 100
#> 7 chr3   1
#> 8 chr3  10
#> 9 chr3 100

玩具bed

bed <- data.frame(
  CHR   = paste0("chr", rep(1:3, each = 2)),
  Start = c(0, 5, 15),
  Stop  = c(5, 15, 120)
)
bed
#>    CHR Start Stop
#> 1 chr1     0    5
#> 2 chr1     5   15
#> 3 chr2    15  120
#> 4 chr2     0    5
#> 5 chr3     5   15
#> 6 chr3    15  120

然后,如果您还没有,请安装软件包dplyrpurrr(使用install.packages(c("dplyr", "purrr")),然后运行以下内容:

library(dplyr)
library(purrr)

mapinfo %>%
  left_join(bed) %>%
  filter(pmap_lgl(list(M, Start, Stop), between))
#>    CHR   M Start Stop
#> 1 chr1   1     0    5
#> 2 chr1  10     5   15
#> 3 chr2   1     0    5
#> 4 chr2 100    15  120
#> 5 chr3  10     5   15
#> 6 chr3 100    15  120

这是mapinfo中所有元素的数据框,介于Start中指定的Stopbed值之间。此时,您可以根据需要将其拆分,删除StartStop列等。

重要提示:CHR必须在两个数据框中具有完全相同的标签(例如,所有大写字母)。我注意到你在一个帽子中只有一个,而在另一个帽子里只有一个字母的帽子。在这里保持一致(a)使这个代码有效,(b)因为一致性使你的代码更容易消化。

为了帮助您提高对代码的理解,以下是与数据科学相关的一些相关链接&#34;作者:Garrett Grolemund和Hadley Wickham: