【问题标题】:Using dplyr to normalize against a group control使用 dplyr 对组控制进行标准化
【发布时间】:2021-06-30 13:01:57
【问题描述】:

我的数据集包含三个因子:“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

等等。

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 中的一个新功能,但没有成功。

提前非常感谢!

JP.

【问题讨论】:

  • 您对control 应用过滤器的第二个数据集似乎没问题,您希望输出如何?
  • 我想要第二个数据集中显示的输出,除了我显示的输出是用 excel 制作的。我想要那个输出但是用 R.
  • 我通常通过使用filtergroup_bysummarizeleft_join 创建一个数据框来处理这个问题数据框。然后可以使用mutate来计算prol_norm。如果您可以发布一些数据,我们可能会更有帮助。将(dput(df)) 的输出复制到您的问题中。
  • 感谢您的意见!在帖子的开头,我已经有了我的数据的代表。你应该能够使用它:)

标签: r dplyr data-wrangling


【解决方案1】:

我认为这适用于您的数据集。为此,我首先计算了分组平均值,然后将每个 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.
)

【讨论】:

  • 不幸的是,这是我已经实现的。仅改变先前过滤的行。我想将突变应用于属于 linea 组的所有行(不仅是对照组)。
  • 我在这里有点困惑,但也许如果您分享未经过滤的数据摘录,我们可以为您提供更好的帮助。
  • 再次您好,非常感谢您的耐心等待。我已经更新了帖子,所以希望你现在能更好地理解它。您已经随机摘录了我的数据集(这是第二个)。再次感谢!
  • 没关系,我只需要一个可重现的原始数据。你能分享一下吗?
  • 另一个问题是你的 dopaje 和 concentracion 列是字符和数字向量的混合,它会自动强制转换为字符向量。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 2020-10-24
    • 2019-01-12
    • 2020-03-08
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    相关资源
    最近更新 更多