对于R中的循环分块

时间:2015-11-13 14:44:13

标签: r loops for-loop nested

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

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循环呢?我想我需要循环,但我不确定如何。

谢谢!

2 个答案:

答案 0 :(得分:3)

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和许多其他的split-apply-combine工具)。

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

答案 1 :(得分:1)

您也可以使用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