计算潮汐范围

3
我有一个数据框,包含关于潮汐的以下信息。我正在尝试编写一个函数,该函数需要四个参数(low.max,hi.max,hi.earliest,hi.latest)。例如,显示所有低潮小于或等于2英尺,高潮小于或等于6英尺,并且高潮发生在上午10点到下午4点之间的日子。目前,我正在通过循环行来完成这个任务(在某种程度上已经可以使用hi.max-low.max),但我对R比较陌生,认为应该有更符合R语言风格的方法。
  date      day  time       ft      cm     H/L
2013/01/01  Tue 07:03 AM    8.1     247     H
2013/01/01  Tue 12:49 PM    5.1     155     L
2013/01/01  Tue 05:30 PM    5.7     174     H
2013/01/02  Wed 12:03 AM    0.5     15      L
2013/01/02  Wed 07:33 AM    8.1     247     H
2013/01/02  Wed 01:40 PM    4.4     134     L
2013/01/02  Wed 06:32 PM    5.3     162     H
2013/01/03  Thu 12:42 AM    1.4     43      L
2013/01/03  Thu 08:03 AM    8.1     247     H
2013/01/03  Thu 02:33 PM    3.5     107     L
2013/01/03  Thu 07:46 PM    4.9     149     H

添加 dput 输出:
structure(list(Date = structure(c(15706, 15706, 15706, 15707, 
15707, 15707, 15707, 15708, 15708, 15708), class = "Date"), Day = c("Tue", 
"Tue", "Tue", "Wed", "Wed", "Wed", "Wed", "Thu", "Thu", "Thu"
), Time = c("7:03 AM", "12:49 PM", "5:30 PM", "12:03 AM", "7:33 AM", 
"1:40 PM", "6:32 PM", "12:42 AM", "8:03 AM", "2:33 PM"), Pred.Ft. = c(8.1, 
5.1, 5.7, 0.5, 8.1, 4.4, 5.3, 1.4, 8.1, 3.5), Pred.cm. = c(247L, 
155L, 174L, 15L, 247L, 134L, 162L, 43L, 247L, 107L), High_Low = c("H", 
"L", "H", "L", "H", "L", "H", "L", "H", "L")), .Names = c("Date", 
"Day", "Time", "Pred.Ft.", "Pred.cm.", "High_Low"), row.names = c(NA, 
10L), class = "data.frame")

就 hi/lo 部分而言,独立于时间,我尝试了以下方法:

  tides <- read.csv("TideData.csv", stringsAsFactors = FALSE)

  for (i in 1: nrow(tides)){
    if (tides[i, 6] == "L" & tides[i, 4] <= low.max 
        & tides[i+1, 6] == "H" & tides[i+1, 4] <= hi.max){

      #deal with last iteration being out of bounds / write out to a df

    }

1
请提供机器可读的数据示例。使用 dput(head(dat, 11)),其中 dat 是您的数据框。这样可以清楚地查看您的实际数据长什么样子。 - Matthew Lundberg
请发布您尝试过但无法正常工作的代码。"例如,展示给我看"这句话让人感觉像是您想要别人为您完成一项作业,而我们不会在这里做那样的事情。 :-) - Ken White
已添加dput - 谢谢。这不是作业 - 我只是在一个非常依赖潮汐的地方冲浪,今天又被淘汰了:-)。 - user2014994
所以提供的数据的正确答案是“以上都不是”吗?我有一个编码答案,但它没有给出任何一天在下午4点之前有“H” < 6,这也是我的肉眼测试告诉我的。 - IRTFM
谢谢DWin。你说得对,我的示例数据不符合时间要求。 - user2014994
2个回答

2

在R中,子集数据是非常基础的操作,例如在R手册An Introduction to R中有详细描述。

假设您的数据被称为x,使用子集运算符[指定要保留的行:

x[x$Pred.Ft < 2, ]

        Date Day     Time Pred.Ft. Pred.cm. High_Low
4 2013-01-02 Wed 12:03 AM      0.5       15        L
8 2013-01-03 Thu 12:42 AM      1.4       43        L

或者仅限于高潮:
x[x$Pred.Ft > 6, ]

        Date Day    Time Pred.Ft. Pred.cm. High_Low
1 2013-01-01 Tue 7:03 AM      8.1      247        H
5 2013-01-02 Wed 7:33 AM      8.1      247        H
9 2013-01-03 Thu 8:03 AM      8.1      247        H

要结合逻辑语句,请使用|表示OR&表示AND。因此,要一步获取低潮和高潮的集合:

x[x$Pred.Ft > 6 | x$Pred.Ft < 2, ]


        Date Day     Time Pred.Ft. Pred.cm. High_Low
1 2013-01-01 Tue  7:03 AM      8.1      247        H
4 2013-01-02 Wed 12:03 AM      0.5       15        L
5 2013-01-02 Wed  7:33 AM      8.1      247        H
8 2013-01-03 Thu 12:42 AM      1.4       43        L
9 2013-01-03 Thu  8:03 AM      8.1      247        H

为了只获取春潮中的高潮,请尝试以下方法。由于您知道每个低潮后面都会有一个高潮,因此可以使用diff计算潮差,并仅返回差异高于阈值的行:
x$Tidediff <- c(NA, diff(x$Pred.Ft))
na.omit(x[x$Tidediff > 6, ])

        Date Day    Time Pred.Ft. Pred.cm. High_Low Tidediff
5 2013-01-02 Wed 7:33 AM      8.1      247        H      7.6
9 2013-01-03 Thu 8:03 AM      8.1      247        H      6.7

谢谢 - 我已经了解了子集的一般概念。我正在尝试找到在一天的某个时间范围内,特定最大高度的低点后面跟着特定最大高度的高点的情况。数据按时间顺序排列。 - user2014994

1
使用by函数来处理具有相同日期值的记录:
L.lt.2 <- by(tides, tides$Date, FUN= function(d) d[
                          d$High_Low=="L" & d$Pred.Ft <= 2,  "Date",drop=FALSE])
H.lt.6.b.4 <- by(tides, tides$Date, FUN= function(d) d[
               d$High_Low=="H"     &     d$Pred.Ft <= 6    & 
               as.POSIXct(d$Time, format="%H:%M %p") <= 
                                           as.POSIXct("4:00 PM", format="%H:%M %p"), 
                                                             "Date", drop=FALSE])
intersect(L.lt.2, H.lt.6.b.4)
#[[1]]
#character(0)

由于数据不支持对条件进行测试,因此没有费心添加额外的时间要求。这只是一个“练习”,因为它只涉及向[i, ...]选择操作添加一个额外的逻辑向量。(最好构建一个示例,其中至少有一个日期满足目标。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接