【问题标题】:Standardise series of measurements into a single timeline in R将一系列测量标准化为 R 中的单个时间线
【发布时间】:2020-09-25 10:54:53
【问题描述】:

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

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

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

       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


    【解决方案1】:

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

    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+
    

    【讨论】:

    • 如果我想再问一步,同样的问题,我该怎么办?编辑第一个帖子?在评论部分我没有足够的空间
    • @johnposieux 如果它很复杂,您可能需要提出一个新问题,以便有空间提供新的答案。如果是短点可以在cmets中问。
    • 并不复杂,stackoverflow的说明建议编辑帖子。
    • @johnposieux 我已经完全重写了我的答案。我希望这能满足您的需求。
    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 2017-12-02
    • 2014-12-31
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2015-09-28
    相关资源
    最近更新 更多