在tapply中使用tapply

时间:2017-01-02 08:56:27

标签: r tapply

我有一个基因组数据的大data.frame。 数据看起来像这样 - colnames(df)=c("id","chr","start","end","log2") 其中id是样本名称,chr是染色体的编号,start和end给我染色体上的位置,log2是该位置读取的高/低。

因为有很多数据,而且很难理解发生了什么,我试图检查每个样本(id)和每个染色体(chr)我想计算段中log2的中位数,比如说所有的读取都在1到10 ^ 7,1 + 10 ^ 7到2 * 10 ^ 7之间,等等。

结果应该是一个新的data.frame,对于每个样本和每个染色体,我应该有几行,其中start和end表示我所在的段,最后一个值将是该段的中位数。

我想我需要使用tapply()并查看样本,并在其中tapply()并遍历染色体,然后在每条染色体中,循环开始"开始"位置? (假设我只关心起始坐标是否在范围内) 不确定如何处理这个问题。

任何提示,提示,指示都将非常感激。

可重复的例子 -

# fabricated data, 4 samples
# 24 chromosomes in each sample
# 61 ranges in each chromosome

df <- data.frame(id = rep(c('F1','F2','M1','M2'), each = 24*61), 
                 chr = rep(rep(c(1:22,'x','y'), each = 61),4),
                 start = rep(seq(1,25*10^6 - 99, length.out = 61),times = 24*4),
                 end = rep(seq(100,25*10^6, length.out = 61),times = 24*4),
                 log2 = rnorm(4*24*61))

# output should look something like this-
id      chr     start    end       median_log_2
"F1"    "1"     1        8000000   0.002
"F1"    "1"     8000001  16000000  0.00089
"F1"    "1"     16000001 24000000  -0.0011
"F1"    "1"     24000000 25000000  0.108
"F1"    "2"     1        8000000   -0.0012
"F1"    "2"     8000001  16000000  0.0089
"F1"    "2"     16000001 24000000  0.00311
"F1"    "2"     24000000 25000000  0.0128
...
...

1 个答案:

答案 0 :(得分:0)

median_data <- tapply(df$log2, 
                      list(df$id, 
                           df$chr, 
                           cut(df$start, c(0,8*10^6,1.6*10^7,2.4*10^7,3.2*10^7,4*10^8))),
                      median)
median_data <- as.data.frame.table(median_data)

做了这个工作。 (输出的格式不正确,但它对我来说非常接近)

tapply()中,您可以使用list()按多个参数进行分组。