按级别组合计数数据帧过滤的行

时间:2019-05-02 15:53:47

标签: r subset

我有这个数据帧(这是我的ChIp-seq数据的8个不同Bed文件之间的multibedintersect的输出):

    head(Table,)
    chrom   start     end num  list
2   chr1 4491607 4493602   2   6,7
6   chr1 4571540 4571826   2   7,8
15  chr1 5019126 5020672   2   2,7
21  chr1 7139275 7139745   3 4,6,7
23  chr1 7398185 7398658   2   7,8
28  chr1 9745462 9745912   4 1,4,6,7

“列表”列是一个字符串,代表我的样品列表中该特定峰的存在。

例如,在样本编号6和7中都发现了峰“ 2”。

我想统计在数据集中找到两个样本的每个组合的次数,创建一个汇总信息的表。

因此,基本上,multibedintersect会产生过多的重叠。我只是对样本在当时彼此之间如何重叠感兴趣。

例如,在峰值 2,21,28 中找到了样本 6和7 ,并且发现了样本 4和6 21和28

峰中

通过包装类型,我可以同时解决1个样品的问题,但无法为每种组合“使其循环”。

     Table %>%
  filter(str_detect(list, "6,7"))

通过这种方式,我得到了具有该组合的所有东西:

   chrom   start     end num  list
2   chr1 4491607 4493602   2   6,7
21  chr1 7139275 7139745   3 4,6,7
28  chr1 9745462 9745912   4 1,4,6,7

我认为这表现不佳且需要大量脚本,因为我需要手动过滤每种组合: 仅举几例:

  • 7,8
  • 6,8
  • 5,8
  • 4,8
  • 3,8
  • 2,8
  • 1,8
  • 6,7
  • 继续

以这种“我的方式”做这样的事情会很可怕:

Counts <- NULL
Pippo <- Table %>%
  filter(str_detect(list, "7,8"))
Counts <- cbind(nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "6,8"))
Counts <- cbind(Counts, nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "5,8"))
Counts <- cbind(Counts, nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "4,8"))
Counts <- cbind(Counts, nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "3,8"))
Counts <- cbind(Counts, nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "2,8"))
Counts <- cbind(Counts, nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "1,8"))
Counts <- cbind(Counts, nrow(Pippo))

您能否建议我一种更好的方法来计算每个组合并创建此汇总数据框架?

非常感谢

1 个答案:

答案 0 :(得分:1)

请考虑使用两个sapply调用基数R:一个使用combn来构建所有对字符串,然后使用另一个grepl来子集数据帧以检索行计数:

pairs <- sapply(combn(1:8, 2, simplify=FALSE), function(i) paste(i, collapse=","))

Counts <- sapply(pairs, function(i) nrow(subset(Table, grepl(i, `list`))))

Counts
# 1,2 1,3 1,4 1,5 1,6 1,7 1,8 2,3 2,4 2,5 2,6 2,7 2,8 3,4 3,5 3,6 3,7 3,8 4,5 4,6 
#   0   0   1   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   2 
# 4,7 4,8 5,6 5,7 5,8 6,7 6,8 7,8 
#   0   0   0   0   0   3   0   2 

或者,使用整齐的版本(dplyr + purrr):

pairs <- combn(1:8, 2, simplify=FALSE) %>% 
  map(~(paste(., collapse=","))) %>%
  unlist()

Counts <- pairs %>% 
  map(~(filter(Table, str_detect(list, .)) %>% nrow)) %>%
  setNames(pairs) %>%
  unlist()

Counts
# 1,2 1,3 1,4 1,5 1,6 1,7 1,8 2,3 2,4 2,5 2,6 2,7 2,8 3,4 3,5 3,6 3,7 3,8 4,5 4,6 
#   0   0   1   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   2 
# 4,7 4,8 5,6 5,7 5,8 6,7 6,8 7,8 
#   0   0   0   0   0   3   0   2