使用 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