我在 R 中有一个数据框,格式如下:
Treatment Sample Time_point M1
A 1 0 0.12
A 2 0 0.45
A 3 0 0.35
A 1 1 0.76
A 2 1 0.45
A 3 1 0.41
A 1 2 0.94
A 2 2 0.55
A 3 2 0.44
等等。有 5 种不同的处理、3 个样本和 10 个时间点。还有大约 50 列各种测量值,名称不相关 - 我在这里只显示其中的第一个,M1。
对于这 50 次测量中的每一次,我想从所有后续时间点中减去它们在零时间保持的值。例如,M1 随后将如下所示:
M1
0
0
0
0.64
0
0.06
0.82
0.10
0.09
我不知道该怎么做。我首先提取时间点零值,对它们进行重复序列,然后减去它们。但是,我一次只能让它工作一列,这有点令人费解。我想知道是否有办法在管道中使用 group_by 和 mutate 来更改每列的值,但无法找到一种方法来指定我需要减去的值。
最佳答案
d$M1 - ave(d$M1, d$Sample, d$Treatment, FUN = function(x) x[1])
#[1] 0.00 0.00 0.00 0.64 0.00 0.06 0.82 0.10 0.09
对于多个列,请尝试
nm = c("M1") #Add column names here
sapply(nm, function(s){
d[[s]] - ave(d[[s]], d$Sample, d$Treatment, FUN = function(x) x[1])
})
# M1
# [1,] 0.00
# [2,] 0.00
# [3,] 0.00
# [4,] 0.64
# [5,] 0.00
# [6,] 0.06
# [7,] 0.82
# [8,] 0.10
# [9,] 0.09
tidyverse
等价物可能是
d %>% group_by(Sample, Treatment) %>% mutate_at(nm, function(x) x - x[1])
关于r - 根据分组从列中减去值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57877593/