library(dplyr)

df <- read.csv("typhoon.csv")

# 因為當日24時與隔夜0時是同一個, 因此再產生一個新欄位Hour_new, 與Hour相同
# 但如果颱風跨日存在, 則Hour_new的最後一筆將變成24
dft <- df %>%
  mutate(date = paste(Year, Month, Day, sep = "-"),
         date = as.Date(date)
         ) %>%
  group_by(CycloneNo) %>%
  mutate(# 對每一列, 以下一列日期減去該列日期, 如果 = 1代表颱風跨日
         daydiff = as.integer(lead(date) - date),
         # 由於最後一列的下一列不存在, 會有NA, 用0補NA
         daydiff = ifelse(is.na(daydiff), 0, daydiff),
         # 如果某一列daydiff == 1, 將該列Hour轉換成24, 否則保留原來Hour
         Hour_new = ifelse(daydiff == 1, 24, Hour)
  ) %>%
  group_by(date) %>%
  # 計算每天颱風存在的時數
  # 由於有可能存在當天只有一筆 (Hour = 18), 但颱風跨日, 因此min從原本的Hour欄位取值
  mutate(Hour_sum = max(Hour_new) - min(Hour)) %>%
  filter(Hour_sum >= 18 & row_number()==1) %>%
  ungroup()