首页 > 解决方案 > 从数据框中计算每日参数,其中包含行中的每小时值和几列感兴趣的列

问题描述

数据框汇总了每小时 ( ) 不同深度 ( , , )的df1水温。作为数据框的示例:T5mT15mT25mT35mDatetime

df1<- data.frame(Datetime=c("2016-08-12 12:00:00","2016-08-12 13:00:00","2016-08-12 14:00:00","2016-08-12 15:00:00","2016-08-13 12:00:00","2016-08-13 13:00:00","2016-08-13 14:00:00","2016-08-13 15:00:00"),
                    T5m= c(10,20,20,10,10,20,20,10),
                    T15m=c(10,20,10,20,10,20,10,20),
                    T25m=c(20,20,20,30,20,20,20,30),
                    T35m=c(20,20,10,10,20,20,10,10))
df1$Datetime<- as.POSIXct(df1$Datetime, format="%Y-%m-%d %H")
df1

             Datetime T5m T15m T25m T35m
1 2016-08-12 12:00:00  10   10   20   20
2 2016-08-12 13:00:00  20   20   20   20
3 2016-08-12 14:00:00  20   10   20   10
4 2016-08-12 15:00:00  10   20   30   10
5 2016-08-13 12:00:00  10   10   20   20
6 2016-08-13 13:00:00  20   20   20   20
7 2016-08-13 14:00:00  20   10   20   10
8 2016-08-13 15:00:00  10   20   30   10

我想创建一个新的数据框df2,其中我有每个深度间隔和整个水柱的每天平均水温和标准误差估计。我会期待这样的事情(我是手工计算的,所以可能会有一些错误):

> df2
        Date meanT5m meanT15m meanT25m meanT35m meanTotal seT5m seT15m seT25m seT35m seTotal
1 2016-08-12      15       15     22.5       15    16.875  2.88   2.88    2.5   2.88    1.29
2 2016-08-13      15       15     22.5       15    16.875  2.88   2.88    2.5   2.88    1.29

我特别有兴趣知道如何使用它,data.table因为我将使用巨大的 data.frames 并且我认为data.table它非常有效。

为了计算标准误差,我知道std.error()package中的函数plotrix

标签: rdata.tabletidyverselubridateplotrix

解决方案


根据@chinsoon 的评论更新


  1. 首先将您的数据框转换为数据表:

    library(data.table)
    setDT(df1)
    
  2. 创建total列:

    df1[, total := rowSums(.SD), .SDcols = grep("T[0-9]+m", names(df1))][]
    #               Datetime T5m T15m T25m T35m total
    # 1: 2016-08-12 12:00:00  10   10   20   20    60
    # 2: 2016-08-12 13:00:00  20   20   20   20    80
    # 3: 2016-08-12 14:00:00  20   10   20   10    60
    # 4: 2016-08-12 15:00:00  10   20   30   10    70
    # 5: 2016-08-13 12:00:00  10   10   20   20    60
    # 6: 2016-08-13 13:00:00  20   20   20   20    80
    # 7: 2016-08-13 14:00:00  20   10   20   10    60
    # 8: 2016-08-13 15:00:00  10   20   30   10    70
    
  3. 应用以下功能day

    library(lubridate)
    (df3 <- df1[, as.list(unlist(lapply(.SD, function (x)
                 c(mean = mean(x), sem = sd(x) / sqrt(length(x)))))), 
           day(Datetime)])
    #    day T5m.mean  T5m.sem T15m.mean T15m.sem T25m.mean T25m.sem T35m.mean
    # 1:  12       15 2.886751        15 2.886751      22.5      2.5        15
    # 2:  13       15 2.886751        15 2.886751      22.5      2.5        15
    #    T35m.sem total.mean total.sem
    # 1: 2.886751       67.5  4.787136
    # 2: 2.886751       67.5  4.787136
    

推荐阅读