在R中添加列和带时间的算术
我有一个.csv格式的表,其中有12K行,如下所示:在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
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
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