对于 R 中的循环分块
For Loop chunking in R
我有一些数据如下所示:
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
我想将此数据标准化为参考行。每个 Exp 有 5 行,ref 总是在第二行。我怎样才能用 for 循环做到这一点?我在想我需要 for 循环,但我不确定如何。
谢谢!
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)
Package 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
您也可以使用 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
我有一些数据如下所示:
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
我想将此数据标准化为参考行。每个 Exp 有 5 行,ref 总是在第二行。我怎样才能用 for 循环做到这一点?我在想我需要 for 循环,但我不确定如何。
谢谢!
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)
Package 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
您也可以使用 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