r - 根据分组从列中减去值

标签 r dplyr data.table data-manipulation

我在 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/

相关文章:

r - 在 R 中将时间戳标记到 session 中

r - R 中递归解的迭代

r - R中的条件cumsum?

r - R 中所有列的 1 天滞后、3 天平均滞后和 7 天平均滞后

r - 合并后是否有可用的 _merge 指示器?

R 数据立方体定义层次结构

r - 如何检查数据表中每一行的列值是否在另外两个范围内

r - 在 R data.table 中,根据另一列的值乘以列名

r - 总结一年内的公司数量

r - 如何仅将函数应用于 dplyr 中组的第一行?