我有一个基因组数据的大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
...
...
答案 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()
按多个参数进行分组。