如何根据两列绘制直方图

时间:2014-08-05 21:57:46

标签: r

我有一个包含三列的数据集,名为chr,leftPos和Z Score。 左侧pos在chr内变化(leftPos是染色体chr中基因的位置 - 它是染色体特异性而不是绝对编号系统) 我想根据每个染色体的binned leftPos绘制Z得分的总和。

数据如下所示:

chr     leftPos   ZScore
chr1    10          5
chr1    10000       4
chr1    17887       4
chr1    19999       4
chr2    24          0
chr2    178        -2
chr2    19000      -2

绘图前的数据应如下所示:

chr1
  Bins:    SummedZScore
 1-10000       9
10001-20000    8

chr2

Bins:    SummedZScore
 1-10000       -2
10001-20000    -2

1 个答案:

答案 0 :(得分:1)

查看我今天早些时候回答的similar post。对于此数据集,请尝试:

tbl <- structure(list(chr = c("chr1", "chr1", "chr1", "chr1", "chr2", 
    "chr2", "chr2"), leftPos = c(10L, 10000L, 17887L, 19999L, 24L, 
    178L, 19000L), ZScore = c(5L, 4L, 4L, 4L, 0L, -2L, -2L)), .Names = c("chr", 
    "leftPos", "ZScore"), class = "data.frame", row.names = c(NA, -7L))

library(dplyr)
tbl_df(tbl) %>%
    group_by(chr, binnum = (leftPos-1) %/% 10000) %>%
    summarise(SummedZScore = sum(ZScore)) %>%
    mutate(binRight = (binnum+1) * 10000) %>%
    select(binRight, SummedZScore)
##  Source: local data frame [4 x 3]
##  Groups: chr
##  
##     chr binRight SummedZScore
##  1 chr1    10000            9
##  2 chr1    20000            8
##  3 chr2    10000           -2
##  4 chr2    20000           -2

我在这里硬编码10000,但这很容易修复。我做(leftPos-1)的原因是你想要10000包含在较小的bin中,而不是下一个bin中的第一个bin。 (binnum+1)的使用主要是装饰性的,无论您想知道bin 启动的位置还是停止的位置。您可以更进一步添加一列,以便您可以为每个行/ bin创建开始和停止数字。