R 计算潮差
我有一个包含以下潮汐信息的数据框。我正在尝试编写一个包含四个参数(low.max、hi.max、hi.earlime、hi.latest)的函数。例如,向我展示所有一天中,低水位为2英尺或以下,高水位为6英尺或以下,高水位发生在上午10点到下午4点之间。现在我正在通过行循环来完成这项工作(有点让hi.max-low.max处理它),但我对R是新手,并且假设有一种更像R的方法R 计算潮差,r,R,我有一个包含以下潮汐信息的数据框。我正在尝试编写一个包含四个参数(low.max、hi.max、hi.earlime、hi.latest)的函数。例如,向我展示所有一天中,低水位为2英尺或以下,高水位为6英尺或以下,高水位发生在上午10点到下午4点之间。现在我正在通过行循环来完成这项工作(有点让hi.max-low.max处理它),但我对R是新手,并且假设有一种更像R的方法 date day time ft cm H/L 2013/01/01 Tu
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
}
tides子集数据是R中非常基本的操作,例如在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 | 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
使用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)
L.lt.2请在示例中加入机器可读的数据。使用dput(head(dat,11))
其中dat
是您的数据帧。这样就可以清楚地看到您的数据的实际外观。发布您迄今为止尝试过但不适用于您的代码。“例如,演示给我看”这听起来像是一个家庭作业,你希望有人为你做,而我们在这里不这样做。:-)添加了dput-谢谢。不是家庭作业-我只是在一个非常依赖潮汐的地方冲浪,今天我又被弄脏了:-)。所以提供的数据的正确答案是“以上都没有”?我有一个编码答案,但它没有给出有“H”的天数<6次<下午4点,这也是我的眼球测试告诉我的。谢谢,德温。你是对的,我的示例数据不符合时间要求。谢谢——我得到了子集的一般想法。我正在尝试找到一种情况,即某个最大高度的低值之后是某个最大高度的高值,所有这些都在一定的时间范围内日期。数据是按时间顺序排列的。“by”是我要找的。谢谢!
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
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)