使用 dplyr 对组控制进行标准化
Using dplyr to normalize against a group control
我的数据集包含三个因素:“line”、“dop”和“conc”。每个“行”组有四行,其中“dop”和“conc”值是“控制”。您可以在下面找到数据集的工作示例:
line;dop;conc;prol
a;undop;100;0,1540
a;undop;100;0,2770
a;undop;100;0,2460
a;0,0175;100;0,2030
a;0,0175;100;0,1630
a;0,0175;100;0,2300
a;0,015;100;0,2960
a;0,015;100;0,1070
a;0,015;100;0,2450
a;0,013;100;0,1890
a;0,013;100;0,2910
a;0,013;100;0,2490
a;0,02;100;0,1250
a;0,02;100;0,2910
a;0,02;100;0,2650
a;0,01;100;0,2040
a;0,01;100;0,1030
a;0,01;100;0,1100
a;0,005;100;0,1770
a;0,005;100;0,2890
a;0,005;100;0,1920
a;0,001;100;0,2820
a;0,001;100;0,2480
a;0,001;100;0,1320
a;control;control;0,1640
a;undop;10;0,2920
a;undop;10;0,2580
a;undop;10;0,1900
a;0,0175;10;0,2060
a;0,0175;10;0,2860
a;0,0175;10;0,1010
a;0,015;10;0,2720
a;0,015;10;0,1300
a;0,015;10;0,2720
a;0,013;10;0,2760
a;0,013;10;0,2910
a;0,013;10;0,2630
a;0,02;10;0,1900
a;0,02;10;0,2710
a;0,02;10;0,1770
a;0,01;10;0,2980
a;0,01;10;0,2580
a;0,01;10;0,1500
a;0,005;10;0,3000
a;0,005;10;0,2510
a;0,005;10;0,1990
a;0,001;10;0,1270
a;0,001;10;0,2040
a;0,001;10;0,2860
a;control;control;0,1300
a;undop;1;0,2780
a;undop;1;0,1250
a;undop;1;0,2710
a;0,0175;1;0,1000
a;0,0175;1;0,2920
a;0,0175;1;0,2340
a;0,015;1;0,1620
a;0,015;1;0,1230
a;0,015;1;0,2770
a;0,013;1;0,1330
a;0,013;1;0,1880
a;0,013;1;0,2530
a;0,02;1;0,1410
a;0,02;1;0,1720
a;0,02;1;0,1780
a;0,01;1;0,2190
a;0,01;1;0,1650
a;0,01;1;0,1260
a;0,005;1;0,1210
a;0,005;1;0,1200
a;0,005;1;0,1160
a;0,001;1;0,1720
a;0,001;1;0,1320
a;0,001;1;0,2410
a;control;control;0,2590
a;undop;0,1;0,1880
a;undop;0,1;0,2340
a;undop;0,1;0,1950
a;0,0175;0,1;0,1630
a;0,0175;0,1;0,1190
a;0,0175;0,1;0,2250
a;0,015;0,1;0,2520
a;0,015;0,1;0,2890
a;0,015;0,1;0,2150
a;0,013;0,1;0,2850
a;0,013;0,1;0,1350
a;0,013;0,1;0,2550
a;0,02;0,1;0,2810
a;0,02;0,1;0,1810
a;0,02;0,1;0,2000
a;0,01;0,1;0,1320
a;0,01;0,1;0,2730
a;0,01;0,1;0,2570
a;0,005;0,1;0,1740
a;0,005;0,1;0,1830
a;0,005;0,1;0,2910
a;0,001;0,1;0,2580
a;0,001;0,1;0,1500
a;0,001;0,1;0,1480
a;control;control;0,2870
b;undop;100;0,2530
b;undop;100;0,1860
b;undop;100;0,1820
b;0,0175;100;0,2850
b;0,0175;100;0,1620
b;0,0175;100;0,2130
b;0,015;100;0,2900
b;0,015;100;0,2610
b;0,015;100;0,1900
b;0,013;100;0,1030
b;0,013;100;0,2650
b;0,013;100;0,2640
b;0,02;100;0,1580
b;0,02;100;0,2470
b;0,02;100;0,2730
b;0,01;100;0,2280
b;0,01;100;0,1850
b;0,01;100;0,2340
b;0,005;100;0,1170
b;0,005;100;0,2370
b;0,005;100;0,1160
b;0,001;100;0,2830
b;0,001;100;0,1560
b;0,001;100;0,1330
b;control;control;0,1410
b;undop;10;0,3000
b;undop;10;0,1430
b;undop;10;0,2910
b;0,0175;10;0,2350
b;0,0175;10;0,2500
b;0,0175;10;0,2100
b;0,015;10;0,1210
b;0,015;10;0,2220
b;0,015;10;0,1360
b;0,013;10;0,2070
b;0,013;10;0,2650
b;0,013;10;0,1450
b;0,02;10;0,2090
b;0,02;10;0,1060
b;0,02;10;0,2520
b;0,01;10;0,1700
b;0,01;10;0,2550
b;0,01;10;0,1570
b;0,005;10;0,1430
b;0,005;10;0,1060
b;0,005;10;0,1740
b;0,001;10;0,1980
b;0,001;10;0,1090
b;0,001;10;0,2330
b;control;control;0,2650
b;undop;1;0,2320
b;undop;1;0,2470
b;undop;1;0,2070
b;0,0175;1;0,2610
b;0,0175;1;0,2090
b;0,0175;1;0,1250
b;0,015;1;0,2780
b;0,015;1;0,2190
b;0,015;1;0,2720
b;0,013;1;0,1500
b;0,013;1;0,2400
b;0,013;1;0,2000
b;0,02;1;0,1780
b;0,02;1;0,1320
b;0,02;1;0,1680
b;0,01;1;0,1430
b;0,01;1;0,1660
b;0,01;1;0,2370
b;0,005;1;0,2040
b;0,005;1;0,2870
b;0,005;1;0,2710
b;0,001;1;0,1460
b;0,001;1;0,1150
b;0,001;1;0,2070
b;control;control;0,2200
b;undop;0,1;0,2680
b;undop;0,1;0,2620
b;undop;0,1;0,2510
b;0,0175;0,1;0,2100
b;0,0175;0,1;0,2980
b;0,0175;0,1;0,1740
b;0,015;0,1;0,2320
b;0,015;0,1;0,1230
b;0,015;0,1;0,2800
b;0,013;0,1;0,1830
b;0,013;0,1;0,1940
b;0,013;0,1;0,2580
b;0,02;0,1;0,2120
b;0,02;0,1;0,2820
b;0,02;0,1;0,1780
b;0,01;0,1;0,2470
b;0,01;0,1;0,2500
b;0,01;0,1;0,2760
b;0,005;0,1;0,1780
b;0,005;0,1;0,1880
b;0,005;0,1;0,1350
b;0,001;0,1;0,1260
b;0,001;0,1;0,2580
b;0,001;0,1;0,2840
b;control;control;0,1880
我想要的是根据我之前提到的四个控制值的平均值对每个“dop”和“conc”行的 prol 变量 的每个值进行归一化。
基本上,您应该将 a 行的每个“prol”值除以其控件的 prol 值的平均值,然后乘以 100。即:
属于 A 行的控件的平均值为:
line dop conc prol
<chr> <chr> <chr> <dbl>
1 a control control 0.164
2 a control control 0.13
3 a control control 0.259
4 a control control 0.287
(0,1640+0,1300+0,2590+0,2870)/4 = 0.21
现在 A 行的每个 prol 值都应该除以这个数字并乘以 100:
line dop conc prol
<chr> <chr> <chr> <dbl>
1 a undop 100 0.154
2 a undop 100 0.277
0.1540/0.21x100=73.33
0.2770/0.21x100=131.9
and so on.
对 B 行也应该这样做。
通过以下几行我已经设法做到了,但它只标准化了与控件对应的数据,并跳过了与其余“dopaje”和“concentracion”级别对应的所有有用数据:
dummy %>%
group_by(line) %>%
filter(dop=="control") %>%
mutate(ctrl=prol/mean(prol)*100)
# A tibble: 8 x 5
# Groups: line [2]
line dop conc prol ctrl
<chr> <chr> <chr> <dbl> <dbl>
1 a control control 0.164 78.1
2 a control control 0.13 61.9
3 a control control 0.259 123.
4 a control control 0.287 137.
5 b control control 0.141 69.3
6 b control control 0.265 130.
7 b control control 0.22 108.
8 b control control 0.188 92.4
您可以看到 ctrl 列现在显示了成功计算的值,但它只针对控制值,跳过了所有有用的其余数据。
我如何才能将该突变扩展到所有行,而不仅仅是“控制”行?我试过使用“cur_data()”,这似乎是 dplyr 中的一个新功能,但还没有成功。
非常感谢!
日本.
我认为这适用于您的数据集。为此,我首先计算分组平均值,然后按行将每个 prol
除以它:
library(dplyr)
df %>%
group_by(linea) %>%
mutate(avg_prol = mean(prol)) %>%
rowwise() %>%
mutate(ctrl = (prol / avg_prol) * 100) %>%
select(-avg_prol)
# A tibble: 16 x 6
# Rowwise: linea
linea dopaje concentracion prol prol_norm ctrl
<chr> <chr> <chr> <dbl> <dbl> <dbl>
1 fibroblastos control control 0.26 98.7 98.7
2 fibroblastos control control 0.262 99.4 99.4
3 fibroblastos control control 0.284 108 108.
4 fibroblastos control control 0.248 94.1 94.1
5 a375 control control 0.851 100 100.
6 a375 control control 0.821 96.8 96.8
7 a375 control control 0.912 108 108.
8 a375 control control 0.809 95.4 95.4
9 hela control control 0.457 107 107.
10 hela control control 0.38 88.6 88.6
11 hela control control 0.432 101 101.
12 hela control control 0.447 104 104.
13 mcf7 control control 0.294 100 100.
14 mcf7 control control 0.258 88.2 88.1
15 mcf7 control control 0.286 97.7 97.6
16 mcf7 control control 0.334 114 114.
数据:
df <- tribble(
~linea, ~dopaje, ~concentracion, ~prol, ~prol_norm,
"fibroblastos", "control", "control", 0.260, 98.7,
"fibroblastos", "control", "control", 0.262, 99.4,
"fibroblastos", "control", "control", 0.284, 108.,
"fibroblastos", "control", "control", 0.248, 94.1,
"a375", "control", "control", 0.851, 100.,
"a375", "control", "control", 0.821, 96.8,
"a375", "control", "control", 0.912, 108.,
"a375", "control", "control", 0.809, 95.4,
"hela", "control", "control", 0.457, 107.,
"hela", "control", "control", 0.38, 88.6,
"hela", "control", "control", 0.432, 101.,
"hela", "control", "control", 0.447, 104.,
"mcf7", "control", "control", 0.294, 100.,
"mcf7", "control", "control", 0.258, 88.2,
"mcf7", "control", "control", 0.286, 97.7,
"mcf7", "control", "control", 0.334, 114.
)
如 here 所示,解决此问题的最简单、最巧妙的方法是:
dummy %>%
group_by(line) %>%
mutate(ctrl=prol/mean(prol[dop=="control"])*100)
# A tibble: 200 x 5
# Groups: line [2]
line dop conc prol ctrl
<chr> <chr> <chr> <dbl> <dbl>
1 a undop 100 0.154 73.3
2 a undop 100 0.277 132.
3 a undop 100 0.246 117.
4 a 0,0175 100 0.203 96.7
5 a 0,0175 100 0.163 77.6
6 a 0,0175 100 0.23 110.
7 a 0,015 100 0.296 141.
8 a 0,015 100 0.107 51.0
9 a 0,015 100 0.245 117.
10 a 0,013 100 0.189 90
# ... with 190 more rows
我的数据集包含三个因素:“line”、“dop”和“conc”。每个“行”组有四行,其中“dop”和“conc”值是“控制”。您可以在下面找到数据集的工作示例:
line;dop;conc;prol
a;undop;100;0,1540
a;undop;100;0,2770
a;undop;100;0,2460
a;0,0175;100;0,2030
a;0,0175;100;0,1630
a;0,0175;100;0,2300
a;0,015;100;0,2960
a;0,015;100;0,1070
a;0,015;100;0,2450
a;0,013;100;0,1890
a;0,013;100;0,2910
a;0,013;100;0,2490
a;0,02;100;0,1250
a;0,02;100;0,2910
a;0,02;100;0,2650
a;0,01;100;0,2040
a;0,01;100;0,1030
a;0,01;100;0,1100
a;0,005;100;0,1770
a;0,005;100;0,2890
a;0,005;100;0,1920
a;0,001;100;0,2820
a;0,001;100;0,2480
a;0,001;100;0,1320
a;control;control;0,1640
a;undop;10;0,2920
a;undop;10;0,2580
a;undop;10;0,1900
a;0,0175;10;0,2060
a;0,0175;10;0,2860
a;0,0175;10;0,1010
a;0,015;10;0,2720
a;0,015;10;0,1300
a;0,015;10;0,2720
a;0,013;10;0,2760
a;0,013;10;0,2910
a;0,013;10;0,2630
a;0,02;10;0,1900
a;0,02;10;0,2710
a;0,02;10;0,1770
a;0,01;10;0,2980
a;0,01;10;0,2580
a;0,01;10;0,1500
a;0,005;10;0,3000
a;0,005;10;0,2510
a;0,005;10;0,1990
a;0,001;10;0,1270
a;0,001;10;0,2040
a;0,001;10;0,2860
a;control;control;0,1300
a;undop;1;0,2780
a;undop;1;0,1250
a;undop;1;0,2710
a;0,0175;1;0,1000
a;0,0175;1;0,2920
a;0,0175;1;0,2340
a;0,015;1;0,1620
a;0,015;1;0,1230
a;0,015;1;0,2770
a;0,013;1;0,1330
a;0,013;1;0,1880
a;0,013;1;0,2530
a;0,02;1;0,1410
a;0,02;1;0,1720
a;0,02;1;0,1780
a;0,01;1;0,2190
a;0,01;1;0,1650
a;0,01;1;0,1260
a;0,005;1;0,1210
a;0,005;1;0,1200
a;0,005;1;0,1160
a;0,001;1;0,1720
a;0,001;1;0,1320
a;0,001;1;0,2410
a;control;control;0,2590
a;undop;0,1;0,1880
a;undop;0,1;0,2340
a;undop;0,1;0,1950
a;0,0175;0,1;0,1630
a;0,0175;0,1;0,1190
a;0,0175;0,1;0,2250
a;0,015;0,1;0,2520
a;0,015;0,1;0,2890
a;0,015;0,1;0,2150
a;0,013;0,1;0,2850
a;0,013;0,1;0,1350
a;0,013;0,1;0,2550
a;0,02;0,1;0,2810
a;0,02;0,1;0,1810
a;0,02;0,1;0,2000
a;0,01;0,1;0,1320
a;0,01;0,1;0,2730
a;0,01;0,1;0,2570
a;0,005;0,1;0,1740
a;0,005;0,1;0,1830
a;0,005;0,1;0,2910
a;0,001;0,1;0,2580
a;0,001;0,1;0,1500
a;0,001;0,1;0,1480
a;control;control;0,2870
b;undop;100;0,2530
b;undop;100;0,1860
b;undop;100;0,1820
b;0,0175;100;0,2850
b;0,0175;100;0,1620
b;0,0175;100;0,2130
b;0,015;100;0,2900
b;0,015;100;0,2610
b;0,015;100;0,1900
b;0,013;100;0,1030
b;0,013;100;0,2650
b;0,013;100;0,2640
b;0,02;100;0,1580
b;0,02;100;0,2470
b;0,02;100;0,2730
b;0,01;100;0,2280
b;0,01;100;0,1850
b;0,01;100;0,2340
b;0,005;100;0,1170
b;0,005;100;0,2370
b;0,005;100;0,1160
b;0,001;100;0,2830
b;0,001;100;0,1560
b;0,001;100;0,1330
b;control;control;0,1410
b;undop;10;0,3000
b;undop;10;0,1430
b;undop;10;0,2910
b;0,0175;10;0,2350
b;0,0175;10;0,2500
b;0,0175;10;0,2100
b;0,015;10;0,1210
b;0,015;10;0,2220
b;0,015;10;0,1360
b;0,013;10;0,2070
b;0,013;10;0,2650
b;0,013;10;0,1450
b;0,02;10;0,2090
b;0,02;10;0,1060
b;0,02;10;0,2520
b;0,01;10;0,1700
b;0,01;10;0,2550
b;0,01;10;0,1570
b;0,005;10;0,1430
b;0,005;10;0,1060
b;0,005;10;0,1740
b;0,001;10;0,1980
b;0,001;10;0,1090
b;0,001;10;0,2330
b;control;control;0,2650
b;undop;1;0,2320
b;undop;1;0,2470
b;undop;1;0,2070
b;0,0175;1;0,2610
b;0,0175;1;0,2090
b;0,0175;1;0,1250
b;0,015;1;0,2780
b;0,015;1;0,2190
b;0,015;1;0,2720
b;0,013;1;0,1500
b;0,013;1;0,2400
b;0,013;1;0,2000
b;0,02;1;0,1780
b;0,02;1;0,1320
b;0,02;1;0,1680
b;0,01;1;0,1430
b;0,01;1;0,1660
b;0,01;1;0,2370
b;0,005;1;0,2040
b;0,005;1;0,2870
b;0,005;1;0,2710
b;0,001;1;0,1460
b;0,001;1;0,1150
b;0,001;1;0,2070
b;control;control;0,2200
b;undop;0,1;0,2680
b;undop;0,1;0,2620
b;undop;0,1;0,2510
b;0,0175;0,1;0,2100
b;0,0175;0,1;0,2980
b;0,0175;0,1;0,1740
b;0,015;0,1;0,2320
b;0,015;0,1;0,1230
b;0,015;0,1;0,2800
b;0,013;0,1;0,1830
b;0,013;0,1;0,1940
b;0,013;0,1;0,2580
b;0,02;0,1;0,2120
b;0,02;0,1;0,2820
b;0,02;0,1;0,1780
b;0,01;0,1;0,2470
b;0,01;0,1;0,2500
b;0,01;0,1;0,2760
b;0,005;0,1;0,1780
b;0,005;0,1;0,1880
b;0,005;0,1;0,1350
b;0,001;0,1;0,1260
b;0,001;0,1;0,2580
b;0,001;0,1;0,2840
b;control;control;0,1880
我想要的是根据我之前提到的四个控制值的平均值对每个“dop”和“conc”行的 prol 变量 的每个值进行归一化。
基本上,您应该将 a 行的每个“prol”值除以其控件的 prol 值的平均值,然后乘以 100。即: 属于 A 行的控件的平均值为:
line dop conc prol
<chr> <chr> <chr> <dbl>
1 a control control 0.164
2 a control control 0.13
3 a control control 0.259
4 a control control 0.287
(0,1640+0,1300+0,2590+0,2870)/4 = 0.21
现在 A 行的每个 prol 值都应该除以这个数字并乘以 100:
line dop conc prol
<chr> <chr> <chr> <dbl>
1 a undop 100 0.154
2 a undop 100 0.277
0.1540/0.21x100=73.33
0.2770/0.21x100=131.9
and so on.
对 B 行也应该这样做。
通过以下几行我已经设法做到了,但它只标准化了与控件对应的数据,并跳过了与其余“dopaje”和“concentracion”级别对应的所有有用数据:
dummy %>%
group_by(line) %>%
filter(dop=="control") %>%
mutate(ctrl=prol/mean(prol)*100)
# A tibble: 8 x 5
# Groups: line [2]
line dop conc prol ctrl
<chr> <chr> <chr> <dbl> <dbl>
1 a control control 0.164 78.1
2 a control control 0.13 61.9
3 a control control 0.259 123.
4 a control control 0.287 137.
5 b control control 0.141 69.3
6 b control control 0.265 130.
7 b control control 0.22 108.
8 b control control 0.188 92.4
您可以看到 ctrl 列现在显示了成功计算的值,但它只针对控制值,跳过了所有有用的其余数据。
我如何才能将该突变扩展到所有行,而不仅仅是“控制”行?我试过使用“cur_data()”,这似乎是 dplyr 中的一个新功能,但还没有成功。
非常感谢!
日本.
我认为这适用于您的数据集。为此,我首先计算分组平均值,然后按行将每个 prol
除以它:
library(dplyr)
df %>%
group_by(linea) %>%
mutate(avg_prol = mean(prol)) %>%
rowwise() %>%
mutate(ctrl = (prol / avg_prol) * 100) %>%
select(-avg_prol)
# A tibble: 16 x 6
# Rowwise: linea
linea dopaje concentracion prol prol_norm ctrl
<chr> <chr> <chr> <dbl> <dbl> <dbl>
1 fibroblastos control control 0.26 98.7 98.7
2 fibroblastos control control 0.262 99.4 99.4
3 fibroblastos control control 0.284 108 108.
4 fibroblastos control control 0.248 94.1 94.1
5 a375 control control 0.851 100 100.
6 a375 control control 0.821 96.8 96.8
7 a375 control control 0.912 108 108.
8 a375 control control 0.809 95.4 95.4
9 hela control control 0.457 107 107.
10 hela control control 0.38 88.6 88.6
11 hela control control 0.432 101 101.
12 hela control control 0.447 104 104.
13 mcf7 control control 0.294 100 100.
14 mcf7 control control 0.258 88.2 88.1
15 mcf7 control control 0.286 97.7 97.6
16 mcf7 control control 0.334 114 114.
数据:
df <- tribble(
~linea, ~dopaje, ~concentracion, ~prol, ~prol_norm,
"fibroblastos", "control", "control", 0.260, 98.7,
"fibroblastos", "control", "control", 0.262, 99.4,
"fibroblastos", "control", "control", 0.284, 108.,
"fibroblastos", "control", "control", 0.248, 94.1,
"a375", "control", "control", 0.851, 100.,
"a375", "control", "control", 0.821, 96.8,
"a375", "control", "control", 0.912, 108.,
"a375", "control", "control", 0.809, 95.4,
"hela", "control", "control", 0.457, 107.,
"hela", "control", "control", 0.38, 88.6,
"hela", "control", "control", 0.432, 101.,
"hela", "control", "control", 0.447, 104.,
"mcf7", "control", "control", 0.294, 100.,
"mcf7", "control", "control", 0.258, 88.2,
"mcf7", "control", "control", 0.286, 97.7,
"mcf7", "control", "control", 0.334, 114.
)
如 here 所示,解决此问题的最简单、最巧妙的方法是:
dummy %>%
group_by(line) %>%
mutate(ctrl=prol/mean(prol[dop=="control"])*100)
# A tibble: 200 x 5
# Groups: line [2]
line dop conc prol ctrl
<chr> <chr> <chr> <dbl> <dbl>
1 a undop 100 0.154 73.3
2 a undop 100 0.277 132.
3 a undop 100 0.246 117.
4 a 0,0175 100 0.203 96.7
5 a 0,0175 100 0.163 77.6
6 a 0,0175 100 0.23 110.
7 a 0,015 100 0.296 141.
8 a 0,015 100 0.107 51.0
9 a 0,015 100 0.245 117.
10 a 0,013 100 0.189 90
# ... with 190 more rows