我们提供了一些整齐的数据,包括处理(多个样本和对照),时间点和测量值。我想通过除以控制变量中的相应时间点来归一化所有样本。
我知道如何使用其自己的列中的每个值来执行此操作,但是无法弄清楚如何将gather
mutate
,sumamrise
等{ 1}}或tidyr
可以很简单地做到这一点。
这是示例数据帧定义:
dplyr
数据框如下:
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
我想使用tidyverse程序获取每个治疗和时间点的归一化c(1,1,1,10,10.5,12,11,9,9.333333)
列...
答案 0 :(得分: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
所有这些操作是将每一行的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