我有一个很大的基因组数据 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()
并越过染色体,然后在每个染色体中,一个循环超过"start"位置? (假设我只关心起始坐标是否在范围内)不确定如何处理这个问题 .
任何提示,技巧,方向将非常感激 .
可重复的例子 -
# 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 回答
做完了 . (输出格式不正确,但对我来说非常接近)
在
tapply()
中,您可以使用list()
按多个参数进行子集化 .