在R中添加列和带时间的算术

在R中添加列和带时间的算术,r,math,time-series,R,Math,Time Series,我有一个.csv格式的表,其中有12K行,如下所示: St. date Rgtime RadTime Rain dBZ 3613006 20130113 0:06:00 0:06:00 2 -10.625 3613006 20130113 0:16:00 0:16:00 7 -11.75 3613006 20130113 0:26:00

我有一个.csv格式的表,其中有12K行,如下所示:

St.      date        Rgtime      RadTime       Rain      dBZ 
3613006 20130113     0:06:00      0:06:00       2      -10.625 
3613006 20130113     0:16:00      0:16:00       7      -11.75 
3613006 20130113     0:26:00      0:26:00       1      -10.5625 
3613006 20130113     0:36:00      0:36:00       9      -11.28125 
3613006 20130113     0:46:00      0:46:00       3      -10.34375 
3613006 20130113     0:56:00      0:56:00       8      -11.6875 
3613006 20130113     1:06:00      1:06:00       9      -16 
3613006 20130113     1:16:00      1:16:00       6      -25.3125 
3613006 20130113     1:26:00      1:26:00       1      -16.3125 
3613006 20130113     1:36:00      1:36:00       0      -20.71875
  • $RgTime-10分钟作为RadTimeNew

  • 与RadTimeNew相关的dBZ为dBZ.New

  • new应该在Radtime和dBZ中找到匹配变量

    预期结果:

    St.      date        Rgtime     RadTime    Rain      dBZ        RadTimeNew    dBZ.New 
    3613006 20130113   0:06:00      0:06:00    2       -10.625           NA         NA 
    3613006 20130113   0:16:00      0:16:00    7       -11.75         0:06:00    -10.625 
    3613006 20130113   0:26:00      0:26:00    1       -10.5625       0:16:00    -11.75 
    3613006 20130113   0:36:00      0:36:00    9       -11.28125      0:26:00    -10.5625 
    3613006 20130113   0:46:00      0:46:00    3       -10.34375      0:36:00    -11.28125 
    3613006 20130113   0:56:00      0:56:00    8       -11.6875       0:46:00    -10.34375 
    3613006 20130113   1:06:00      1:06:00    9       -16            0:56:00    -11.6875 
    3613006 20130113   1:16:00      1:16:00    6       -25.3125       1:06:00    -16 
    3613006 20130113   1:26:00      1:26:00    1       -16.3125       1:16:00    -25.3125 
    3613006 20130113   1:36:00      1:36:00    0       -20.7187       1:26:00    -16.3125
    

    我尝试使用lag(),但我的数据时间不连续,出现了一些错误。因此,我正在寻找一个新的脚本(循环,如果…)来处理这个问题

    首先你需要减去这10分钟。我假设您的列表示经过的时间,而不是一天中的时间。由于这可能超过24小时,我不想使用像POSIXct这样的日期和时间数据类型,而是自己计算,如下所示:

    hms <- t(sapply(strsplit(as.character(data$Rgtime), ":"), as.integer))
    secs <- (hms[,1]*60 + hms[,2])*60 + hms[,3] - 10*60
    hms <- matrix(as.integer(c(secs %/% 3600, secs %/% 60 %% 60, secs %% 60)),
                  ncol=3)
    data$RadTimeNew <- sprintf("%d:%02d:%02d", hms[,1], hms[,2], hms[,3])
    data$RadTimeNew[secs < 0] <- NA
    
    mylag <- function(v) v[c(NA,1:length(v)-1)]
    data$RadTimeNew <- mylag(data$RadTime)
    data$dBZ.New <- mylag(data$dBZ)
    hmsstr2secs <- function(str) {
        hms <- sapply(strsplit(as.character(str), ":"), as.integer)
        return ((hms[1,]*60 + hms[2,])*60 + hms[3,])
    }
    nomatch <- (hmsstr2secs(data$Rgtime) - 600 != mylag(hmsstr2secs(data$RadTime)))
    data$RadTimeNew[nomatch] <- NA
    data$dBZ.New[nomatch] <- NA
    

    hms-Hi@MvG。替代代码运行良好。非常感谢。@AliSeif:当你说替代代码运行良好时,这是否意味着我的第一个代码不适合你?以什么方式?因为其他人可能想从你的问题中受益,所以我想解决可能存在的任何问题。
    
    data <- data[c(2,3,4,5,6,7,1,8)]
    
    mylag <- function(v) v[c(NA,1:length(v)-1)]
    data$RadTimeNew <- mylag(data$RadTime)
    data$dBZ.New <- mylag(data$dBZ)
    hmsstr2secs <- function(str) {
        hms <- sapply(strsplit(as.character(str), ":"), as.integer)
        return ((hms[1,]*60 + hms[2,])*60 + hms[3,])
    }
    nomatch <- (hmsstr2secs(data$Rgtime) - 600 != mylag(hmsstr2secs(data$RadTime)))
    data$RadTimeNew[nomatch] <- NA
    data$dBZ.New[nomatch] <- NA