查看时间是否落在涨潮或下跌潮流上

时间:2013-10-18 20:58:10

标签: r

我有这个数据框:

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 =涨潮。

有没有一种有效的方法呢?

1 个答案:

答案 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" 

雅'知道这太复杂了。我将从一开始就重做这个。