我有这个数据框:
tides <- data.frame("time"= c("08:35", "14:28", "13:10", "13:25", "14:30", "12:20"),
"tide 1"= c("04:18 H", "03:54 L", "03:36 H", "02:00 L", "03:54 H", "05:54 H"),
"tide 2"= c("10:30 L", "10:30 H", "09:48 L", "08:18 H", "10:06 L", "12:06 L"),
"tide 3"= c("16:42 H", "16:36 L", "16:00 H", "14:24 L", "16:12 H", "18:12 H"),
"tide 4"= c("22:48 L", "23:00 H", "22:06 L", "20:36 H", "22:24 L", "00:30 L"),
stringsAsFactors = FALSE)
time tide.1 tide.2 tide.3 tide.4
1 08:35 04:18 H 10:30 L 16:42 H 22:48 L
2 14:28 03:54 L 10:30 H 16:36 L 23:00 H
3 13:10 03:36 H 09:48 L 16:00 H 22:06 L
4 13:25 02:00 L 08:18 H 14:24 L 20:36 H
5 14:30 03:54 H 10:06 L 16:12 H 22:24 L
6 12:20 05:54 H 12:06 L 18:12 H 00:30 L
如果time
栏中的时间落在涨潮或下跌潮流上,我需要弄清楚。 tide
列给出了特定日期的低潮和高潮时间。
l =退潮,h =涨潮。
有没有一种有效的方法呢?
答案 0 :(得分:2)
我决定让POSIXct /数字数据框和字符数据框太复杂,并决定在原始字符的apply
ed函数内进行转换。
apply (tides, 1, function(chars) {
tms <- as.POSIXct(chars, format="%H:%M") # will be the current day
if( tms[5] < tms[4]){ tms[5] <-
as.POSIXct( 24*60*60 + as.numeric( tms[5]) , origin="1970-01-01")
} # add a day if last time after midnight
column <- findInterval( as.numeric(tms[1]), as.numeric(tms[2:5]) )
# offset of 1 needed since columns 2:5 are max/min
# pull H/L designation from correct column
previous_tide <- substr(chars[column+1], 7,7) }
)
[1] "H" "H" "L" "H" "L" "L"
因此,如果前一个潮流是“H”,那么它就是“下降趋势”而反之亦然。似乎检查正确。
#------ earlier work---
首先,我需要在第二天的循环结束时(转换为时间等级之后)增加潮汐的时间。
tides2 <- data.frame( lapply(tides, as.POSIXct, format="%H:%M") )
tides2[ tides2[ ,5] < tides2[,4] , 5] <- as.POSIXct(24*60*60 + # day in seconds
as.numeric(tides2[ tides2[ ,5] < tides2[,4] , 5]) , origin="1970-01-01")
然后我意识到apply
搞砸了POSIXct
个日期,但是使用data.matrix整齐地转换为数字:
apply(data.matrix(tides2), 1, function(x)
findInterval( x[1], x[2:5]) )
[1] 1 2 2 2 2 2
所以你的大部分time[,1]
都在第二期。起初我错误地认为这些都属于同一组,但我看到我没有正确考虑潮汐表。 (因为我做了一些航行,这令人尴尬。)所以你需要查找:
apply( tides[2:5], 1, substr, 7,7)
[,1] [,2] [,3] [,4] [,5] [,6]
tide.1 "H" "L" "H" "L" "H" "H"
tide.2 "L" "H" "L" "H" "L" "L"
tide.3 "H" "L" "H" "L" "H" "H"
tide.4 "L" "H" "L" "H" "L" "L"
雅'知道这太复杂了。我将从一开始就重做这个。