在拍拍中使用拍拍
using tapply in tapply
我有大量 data.frame
基因组数据。
数据看起来像这样——
colnames(df)=c("id","chr","start","end","log2")
其中 id 是样本名称,chr 是染色体编号,start 和 end 给出了染色体上的位置,log2 是 high/low 在该位置的读取方式。
因为有很多数据,而且很难理解发生了什么,我试图遍历每个样本 (id),并且对于每个染色体 (chr) 我想计算 log2 的中位数在段中,假设所有读取在 1 到 10^7、1+10^7 到 2*10^7 之间,依此类推。
结果应该是一个新的data.frame
,对于每个样本和每个染色体我应该有几行,开始和结束表示我在哪个片段,最后一个值将是那个的中值段。
我想我需要使用 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
...
...
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()
.
我有大量 data.frame
基因组数据。
数据看起来像这样——
colnames(df)=c("id","chr","start","end","log2")
其中 id 是样本名称,chr 是染色体编号,start 和 end 给出了染色体上的位置,log2 是 high/low 在该位置的读取方式。
因为有很多数据,而且很难理解发生了什么,我试图遍历每个样本 (id),并且对于每个染色体 (chr) 我想计算 log2 的中位数在段中,假设所有读取在 1 到 10^7、1+10^7 到 2*10^7 之间,依此类推。
结果应该是一个新的data.frame
,对于每个样本和每个染色体我应该有几行,开始和结束表示我在哪个片段,最后一个值将是那个的中值段。
我想我需要使用 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
...
...
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()
.