【问题标题】:using tapply in tapply在 tapply 中使用 tapply
【发布时间】:2017-01-02 08:56:26
【问题描述】:

我有一个很大的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,对于每个样本和每个染色体,我应该有几行,开始和结束指示我在哪个片段中,最后一个值将是那个片段的中位数。

我想我需要使用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
...
...

【问题讨论】:

  • 不要用文字描述,只需发布​​reproducible example 和预期的输出。
  • 我将添加一个可重现的示例(就像您想问的那样),但我真的认为这不会让任何事情变得更清楚。
  • “就像我想问的那样”是什么意思???你认为这是个人选择吗?还是我想“欺负”你?我正在努力帮助您(很好),可重复的示例和预期的输出使我(和其他人)更容易帮助您。你在这里问了 16 个问题。我不应该告诉你这样的事情,你不应该那样做 cmets。
  • 不是专门针对你的,但我在这里绕了一圈,我可能会弄错,但在我看来,在很多问题中肯定会要求一个可重复的例子,即使可重复的示例并没有使任何事情变得更清楚。
  • 如果我冒犯了你,我真的很抱歉,我真的不是故意的..

标签: r tapply


【解决方案1】:
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() 将多个参数作为子集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多