-2

我有这个数据框:

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

有没有一种有效的方法来做到这一点?

4

1 回答 1

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" 

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

于 2013-10-18T21:41:36.720 回答