使用R中一个因子的值规范化多个值

使用R中一个因子的值规范化多个值,r,dplyr,tidyverse,tidyr,R,Dplyr,Tidyverse,Tidyr,我们有一些处理(多个样本和对照)、时间点和测量值的整洁数据。我想通过除以控制变量中相应的时间点来规范化所有样本 我知道如何使用自己列中的每一个值来实现这一点,但我不知道如何使用从tidyr或dplyr中收集% 分组单位(时间)%>% 变异(value.norm=value/value[treat=='c']) #一个tibble:9x4 #分组:时间[3] 时间值处理值.norm 110C1 2 20 c 1 3 3 15 c 1 41100 t1 10 52210 t1 10.5 63180

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

我知道如何使用自己列中的每一个值来实现这一点,但我不知道如何使用
tidyr
dplyr
中收集
sumamrise
等组合来以简单的方式实现这一点

以下是数据帧定义示例:

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
预期产出。相同,但与包含
c(1,1,1,10,10.5,12,11,9,9.333333)


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

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

df%>%
分组单位(时间)%>%
变异(value.norm=value/value[treat=='c'])
#一个tibble:9x4
#分组:时间[3]
时间值处理值.norm
110C1
2 20 c 1
3 3 15 c 1
41100 t1 10
52210 t1 10.5
63180 t1 12
71110t211
82180 t29
93140 t29.33
所做的一切就是获取每行的value列,并将其除以具有相同时间值的控制样本的值。如您所见,它不关心样本
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
df%
分组单位(时间)%>%
变异(value.norm=value/value[treat=='c'])
#一个tibble:8x4
#分组:时间[3]
时间值处理值.norm
110C1
2 20 c 1
3 3 15 c 1
42210 t1 10.5
53180 t1 12
61110t211
72180 t29
83140 t29.33

看看预期输出应该是什么可能很有用。比如,您是否只想将时间点1处的t1和t2除以10(时间点1处c组的值),等等?@Atticus29更新了更清晰的输入和预期输出。这太棒了!我编辑了我的输入数据框,因此我将编辑您的答案,以匹配
treat
,而不是
as.factor.treat
。。。谢谢。这取决于治疗是对照的偶数倍?如果
t1
缺少一个时间点,它能像SQL
那样工作吗,其中t1.time==c.time
?是的,它只取存在的每一行,然后除以该时间点控件的值。只要您为每个时间点的
控件
处理设置了一个值,您就不会遇到问题。