【问题标题】:For Loop chunking in RR中的循环分块
【发布时间】:2016-02-15 04:26:27
【问题描述】:

我有一些看起来像这样的数据:

Trace Name             Value
Exp.618.1.1. Saline    -562
Exp.618.1.2. Ref       -30
Exp.618.1.3. 100nM     -50
Exp.618.1.4. 1uM       -65
Exp.618.1.5. 10uM      -75
Exp.619.2.1 Saline     -540
Exp.619.2.2 Ref        -463
Exp.619.2.3. 100nM     -40
Exp.619.2.4 1uM        -39
Exp.619.2.5 10uM       -37

我想将此数据标准化为 Ref 行。每个 Exp 有 5 行,并且 ref 总是在第 2 行。我怎么能用 for 循环做到这一点?我想我需要 for 循环,但我不确定如何。

谢谢!

【问题讨论】:

  • 注意:我需要将我的每个 exp 标准化为它自己的 Ref 行,而不仅仅是集合中的第一个 Ref。
  • 你想做什么? “将此数据标准化为 Ref 行”或“将周围的迹线平均到该 ref 迹线”,无论后者是什么意思?
  • 对不起。我需要从 618.1.1 取盐水,然后除以参考行。并对 619.1.1 跟踪等执行相同操作。
  • 有 2 列还是 3 列?请提供类似 dput(head(your_data, 15)) 的内容。
  • 是的,所以你需要对 ref 进行标准化,好的。我建议您删除“我需要将周围的迹线平均到该参考迹线”。这很令人困惑。

标签: r loops for-loop nested


【解决方案1】:
DF <- read.table(text = "Trace Name             Value
                Exp.618.1.1. Saline    -562
                 Exp.618.1.2. Ref       -30
                 Exp.618.1.3. 100nM     -50
                 Exp.618.1.4. 1uM       -65
                 Exp.618.1.5. 10uM      -75
                 Exp.619.2.1 Saline     -540
                 Exp.619.2.2 Ref        -463
                 Exp.619.2.3. 100nM     -40
                 Exp.619.2.4 1uM        -39
                 Exp.619.2.5 10uM       -37", header = TRUE)

打包 data.table 在这里很有用(但您也可以使用 dplyr 和许多其他拆分-应用-组合工具)。

library(data.table)
setDT(DF)

创建一个标识实验的列。我使用gsub 来查看正则表达式:

DF[, Exp := gsub("(?<=\\d\\.[\\d+]).+", "", Trace, perl = TRUE)]

根据需要调整正则表达式。

然后你可以通过实验来做你的操作:

DF[, Value_norm := Value / Value[2], by = Exp]

#           Trace   Name Value       Exp  Value_norm
# 1: Exp.618.1.1. Saline  -562 Exp.618.1 18.73333333
# 2: Exp.618.1.2.    Ref   -30 Exp.618.1  1.00000000
# 3: Exp.618.1.3.  100nM   -50 Exp.618.1  1.66666667
# 4: Exp.618.1.4.    1uM   -65 Exp.618.1  2.16666667
# 5: Exp.618.1.5.   10uM   -75 Exp.618.1  2.50000000
# 6:  Exp.619.2.1 Saline  -540 Exp.619.2  1.16630670
# 7:  Exp.619.2.2    Ref  -463 Exp.619.2  1.00000000
# 8: Exp.619.2.3.  100nM   -40 Exp.619.2  0.08639309
# 9:  Exp.619.2.4    1uM   -39 Exp.619.2  0.08423326
#10:  Exp.619.2.5   10uM   -37 Exp.619.2  0.07991361

【讨论】:

  • 太棒了!谢谢!一个快速的问题:在最后一部分中,它说 Value/Value[2],2 是基于组中的位置还是基于 618.1.2?如果是后者,我该如何根据位置来做,因为 2 是我为了清楚起见而编造的。
  • 它基于您在问题中指出的位置。如果你不能依赖位置,你当然可以使用Value[Name == "Ref"],但那时你将不得不牺牲一些速度。这是简单的向量子集。您应该对此很熟悉。
  • 啊,好吧。谢谢。这就说得通了。很抱歉再问你一个问题。只有 1 列,即 Value,所以当我运行你的代码时,我得到了一些奇怪的 Exp 列。在我上面的前任中,跟踪名称不是一列,它实际上是行名称(如果这令人困惑,抱歉)。所以当我运行你的代码时,我会得到这样的结果:V1 Exp 6 c(6.-106.-81.-213.-67) 再次感谢!
  • 使用setDT(DF, keep.rownames = TRUE) 并使用rn 列而不是Trace 列。顺便说一句,您应该分享一个最小的、可重复的、代表性的示例。
  • 谢谢。完美运行。下次会尝试给出更好的例子!
【解决方案2】:

你也可以使用dplyr:

library(dplyr)
dat %>% group_by(exptid = substr(dat$Trace, 1, 9)) %>%
        mutate(normalised = Value / Value[Name == "Ref"])

Source: local data frame [10 x 5]
Groups: exptid [2]

          Trace   Name Value    exptid  normalised
         (fctr) (fctr) (int)     (chr)       (dbl)
1  Exp.618.1.1. Saline  -562 Exp.618.1 18.73333333
2  Exp.618.1.2.    Ref   -30 Exp.618.1  1.00000000
3  Exp.618.1.3.  100nM   -50 Exp.618.1  1.66666667
4  Exp.618.1.4.    1uM   -65 Exp.618.1  2.16666667
5  Exp.618.1.5.   10uM   -75 Exp.618.1  2.50000000
6   Exp.619.2.1 Saline  -540 Exp.619.2  1.16630670
7   Exp.619.2.2    Ref  -463 Exp.619.2  1.00000000
8  Exp.619.2.3.  100nM   -40 Exp.619.2  0.08639309
9   Exp.619.2.4    1uM   -39 Exp.619.2  0.08423326
10  Exp.619.2.5   10uM   -37 Exp.619.2  0.07991361

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多