首页 > 解决方案 > 将一系列测量标准化为 R 中的单个时间线

问题描述

我有 6 组大型测量值,用于在定义的时间段内记录的变量。测量值来自通过处理确定的几个样本。每个集合覆盖相同长度(48 小时)的时间间隔,但采样率是可变的,这是时间序列向量长度不同的原因。我想对 7 组测量值进行标准化,以便对数据进行计算并比较处理(例如 7 个系列的平均值、sd、se 等)。

在示例中,已经有 6 个数据集,rbind并且显示了前 20 行。df 有 3 列:从 0 到 48h 的小时分数、连续变量的值以及测量所属的周期(1 到 6)。

输出:一个数据帧,每 30 分钟有一个时间点,从 0 到 48 小时(0'、30'、60'、90' 等)、周期数、治疗,以及在测量变量列中,a最初记录的 2 个最接近的测量值之间的插值。

       hours   NH3_Raw period treatment
1  0.0648130 1089.1048      2        A-
2  0.2134490 2714.9061      1        B-
3  0.2655425  285.1279      2        A+
4  0.3136300 2180.8547      1        B+
5  0.3148610 1091.0609      5        A-
6  0.3155265  246.9763      4        A-
7  0.3155990  382.6315      3        A-
8  0.3156545  606.9789      6        A-
9  0.4562360  241.7223      5        A+
10 0.4570675  196.0806      4        A+
11 0.4571705  186.8204      3        A+
12 0.4572665  426.8417      6        A+
13 0.4644085 1516.0110      2        B-
14 0.5984205 1462.5251      4        B-
15 0.5986460 1318.1283      3        B-
16 0.5992145 2245.7524      5        B-
17 0.5996055 2570.2657      6        B-
18 0.6139253 1069.3496      1        A-
19 0.6645135 1686.3955      2        B+
20 0.7136957  380.8309      1        A+

标签: r

解决方案


您的样本数据包含一些“治疗”和“时期”的组合,它们只有一个时间和关联的值,因此无法对它们进行插值。我假设你的真实数据有更多的点,但我必须在这里创建一个更大的数据集来显示解决方案。

set.seed(69)

df <- data.frame(hours     = sort(runif(6000, 0, 48)),
                 NH3_Raw   = runif(6000, 100, 3000),
                 period    = sample(6, 6000, TRUE),
                 treatment = rep(c("A+", "A-", "B+", "B-"), 1500),
                 stringsAsFactors = FALSE)

head(df)
#>         hours   NH3_Raw period treatment
#> 1 0.006346922 1114.2207      1        A+
#> 2 0.016540099 2676.4284      2        A-
#> 3 0.032535430 2182.8841      6        B+
#> 4 0.035046034  441.9335      3        B-
#> 5 0.040023230  574.9462      6        A+
#> 6 0.040604230 1479.8270      6        A-

我们设置了一个需要插值的时间间隔向量:

desired_times <- seq(0.5, 48, 0.5)

现在我们可以创建一个新的插值数据框,如下所示:

new_df <- 
  do.call(rbind, lapply(split(df, paste(df$period, df$treatment)), function(x) {
    data.frame(hours = desired_times, 
               NH3_Raw = approx(x$hour, x$NH3_Raw, xout = desired_times)$y,
               period = x$period[1],
               treatment = x$treatment[1],
               stringsAsFactors = FALSE)
}))

new_df <- `rownames<-`(new_df[order(new_df$hours),], seq(nrow(new_df)))

所以你的最终结果应该是这样的:

head(new_df, 40)
#>    hours   NH3_Raw period treatment
#> 1    0.5        NA      1        A-
#> 2    0.5 2329.8554      1        A+
#> 3    0.5 1713.3148      1        B-
#> 4    0.5 2615.2987      1        B+
#> 5    0.5  530.4198      2        A-
#> 6    0.5  672.4222      2        A+
#> 7    0.5 1792.0053      2        B-
#> 8    0.5 1668.9496      2        B+
#> 9    0.5 1277.4349      3        A-
#> 10   0.5 1879.1142      3        A+
#> 11   0.5 2369.0511      3        B-
#> 12   0.5 1675.3803      3        B+
#> 13   0.5 1418.1820      4        A-
#> 14   0.5 2240.9298      4        A+
#> 15   0.5 2419.5662      4        B-
#> 16   0.5 1347.4588      4        B+
#> 17   0.5  545.1744      5        A-
#> 18   0.5 1791.8705      5        A+
#> 19   0.5 2412.4291      5        B-
#> 20   0.5 1780.1196      5        B+
#> 21   0.5  648.6645      6        A-
#> 22   0.5 1226.1662      6        A+
#> 23   0.5 1301.0647      6        B-
#> 24   0.5 1027.1567      6        B+
#> 25   1.0 1086.5756      1        A-
#> 26   1.0 1852.5523      1        A+
#> 27   1.0 2113.3323      1        B-
#> 28   1.0 1155.8553      1        B+
#> 29   1.0  959.9907      2        A-
#> 30   1.0 2417.1157      2        A+
#> 31   1.0 2499.6144      2        B-
#> 32   1.0 1449.8900      2        B+
#> 33   1.0  153.8517      3        A-
#> 34   1.0 2557.1666      3        A+
#> 35   1.0  990.5809      3        B-
#> 36   1.0 1703.8757      3        B+
#> 37   1.0 2240.0745      4        A-
#> 38   1.0 1448.1141      4        A+
#> 39   1.0 1946.3077      4        B-
#> 40   1.0  904.2440      4        B+

推荐阅读