在R中,是否有方法将时间点数据“归一化”为起始值的比值?

a11xaf1n  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(98)

假设我有以下从Excel导入的数据表:

glasses_of_water <- tribble(
  ~glass,   ~hours,  ~mass,  ~volume,   ~temp,
  #-------|--------|--------|---------|--------|
  "A",       "0",     500,      5,        20,
  "B",       "0",     500,      5,        20,
  "C",       "0",     500,      5,        20,
  "B",       "10",    450,      5,        22,
  "C",       "10",    250,    2.5,        20,
  "A",       "10",    400,      4,        21,
  "A",       "30",    200,      1,        23,
  "B",       "30",    350,    3.5,        26,
  "C",       "30",      0,      0,        20,
  "C",       "20",      0,      0,        20,
  "B",       "20",    400,      4,        24,
  "A",       "20",    300,      3,        22,
  "A",       "42",    200,      1,        23,
  "B",       "44",    350,    3.5,        26,
  "C",       "46",      0,      0,        20,
)

在从0小时到大约50小时的时间点分析了三杯水。我想为每个测量参数(质量、体积、温度)绘制线图,从中可以看到这些参数如何随时间变化--然而,我想将每个参数视为其初始值的比率,其中0小时值为1.0,然后将所有未来值与之进行比较。
例如,玻璃C开始时的质量为1.0,在10小时时间点降低到0.5,然后在20小时时间点变为0.0。
目前,我将数据存储在Excel工作簿中。我每隔几天就用新的测量值更新数据,并且我有一个单独的工作表专门用于“标准化”值,其中我手动将每个测量值除以受试者在零时的测量值。这很耗时,如果可能,我希望通过R脚本完成此操作。
我经常使用tidyverse套件,我试过...

data0 <- filter(glasses_of_water, hours == "0")
data <- glasses_of_water

ggplot(data) + geom_line(mapping = aes(x = data$hours, y = data$mass/data0$mass, group = glass, color = glass))

......我为零时间点创建了一个对象,并将所有数据除以这些值。这在这个过于简单的示例中有效,但似乎经常会崩溃,尤其是对于由各种因素分隔的较大数据集,以及facet_grids等。我有一些数据集,有数千行和50列。我的实际数据不是tribble格式,它只是一个Excel导入程序;会有问题吗
无论如何,我的问题是:有更简单的方法吗?任何帮助都将不胜感激。

vof42yt1

vof42yt11#

一种分别对每组进行归一化的方法。

library(dplyr)
library(ggplot2)

glasses_of_water %>% 
  group_by(glass) %>% 
  mutate(nmass = mass / mass[hours == "0"]) %>% 
  ggplot() + 
    geom_line(aes(hours, nmass, group = glass, col = glass))

相关问题