-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/numeric データフレームと文字データフレームの両方を持つことは複雑すぎると判断し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]は 2 番目のピリオドにあります。最初は、これらはすべて同じグループに属すると誤って想定していましたが、潮汐表を正しく考えていないことがわかりました。(私はセーリングをしているので、ちょっと恥ずかしいです。)だから、ルックアップが必要です:

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 に答える