【问题标题】:Normalize multiple values using values of one factor in R使用 R 中一个因子的值对多个值进行归一化
【发布时间】:2019-01-13 22:16:58
【问题描述】:

我们有一些整洁的数据,包括处理(多个样本和对照)、时间点和测量值。我想通过除以控制变量中的相应时间点来标准化所有样本。

我知道如何对自己列中的每个值执行此操作,但无法弄清楚如何将gather mutatesumamrise 等从tidyrdplyr 组合到以直接的方式做到这一点。

这是一个示例数据框定义:

structure(list(time = c(1, 2, 3, 1, 2, 3, 1, 2, 3), 
value = c(10, 20, 15, 100, 210, 180, 110, 180, 140), 
as.factor.treat. = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), 
.Label = c("c", "t1", "t2"), class = "factor")), 
.Names = c("time", "value", "treat"), 
row.names = c(NA, -9L), class = "data.frame")

数据框如下所示:

time value   treat
   1    10      c
   2    20      c
   3    15      c
   1   100     t1
   2   210     t1
   3   180     t1
   1   110     t2
   2   180     t2
   3   140     t2

预期输出。相同,但 normvalue 列包含 c(1,1,1,10,10.5,12,11,9,9.333333)

我想使用 tidyverse 程序为每个治疗和时间点取出标准化的value 列...

【问题讨论】:

  • 看看预期的输出应该是什么可能很有用。
  • 比如,你只是想把时间点1的t1和t2除以10(时间点1的c组的值)等等?
  • @Atticus29 更新了更清晰的输入和预期的输出。

标签: r dplyr tidyverse tidyr


【解决方案1】:

如果您按time 分组(假设它是时间点的分组变量),那么我们可以在mutate 语句中使用括号符号来仅在组内搜索。我们可以使用它来访问每个组的控制值,然后将未归一化的值除以:

df %>%
    group_by(time) %>%
    mutate(value.norm = value / value[treat == 'c'])

# A tibble: 9 x 4
# Groups:   time [3]
   time value treat value.norm
  <dbl> <dbl> <fct>      <dbl>
1     1    10 c           1   
2     2    20 c           1   
3     3    15 c           1   
4     1   100 t1         10   
5     2   210 t1         10.5 
6     3   180 t1         12   
7     1   110 t2         11   
8     2   180 t2          9   
9     3   140 t2          9.33

所有这一切都是将每一行的值列除以具有相同时间值的对照样本的值。如您所见,它并不关心样本t1 是否缺少time == 1 的观察:

df <- structure(list(time = c(1, 2, 3, 2, 3, 1, 2, 3), 
                     value = c(10, 20, 15, 210, 180, 110, 180, 140), 
                     as.factor.treat. = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L), 
                                                  .Label = c("c", "t1", "t2"), class = "factor")), 
                .Names = c("time", "value", "treat"), 
                row.names = c(NA, -8L), class = "data.frame")

df %>%
    group_by(time) %>%
    mutate(value.norm = value / value[treat == 'c'])

# A tibble: 8 x 4
# Groups:   time [3]
   time value treat value.norm
  <dbl> <dbl> <fct>      <dbl>
1     1    10 c           1   
2     2    20 c           1   
3     3    15 c           1   
4     2   210 t1         10.5 
5     3   180 t1         12   
6     1   110 t2         11   
7     2   180 t2          9   
8     3   140 t2          9.33

【讨论】:

  • 太棒了!我编辑了输入数据框,因此我将编辑您的答案以匹配 treat 而不是 as.factor.treat...谢谢。
  • 这依赖于治疗甚至是控制的倍数?如果t1 缺少一个时间点,它的功能会像 SQL where t1.time == c.time 一样吗?
  • 是的,它只取存在的每一行并将其除以该时间点的控件值。只要您对每个时间点的control 处理有一个值,您就不会遇到问题。
猜你喜欢
  • 2016-03-09
  • 2013-06-19
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2021-02-28
相关资源
最近更新 更多