问题描述
我有七年的温度数据,每小时记录一次,持续了大约 9 周。 然而,两年中每半小时记录一次。 在那两年里,我只想使用每隔一行,因此是每小时数据。
七年来我有 112 个鸟巢。有188550行数据... 前几行原始数据:
> head(TempData)
# A tibble: 6 x 6
Beach nest Year Datetime Temp nestID
<chr> <dbl> <dbl> <dttm> <dbl> <fct>
1 LB 1 2014 2014-01-12 09:00:00 27.2 LB1_2014
2 LB 1 2014 2014-01-12 10:00:00 27.2 LB1_2014
3 LB 1 2014 2014-01-12 11:00:00 27.2 LB1_2014
4 LB 1 2014 2014-01-12 12:00:00 27.2 LB1_2014
5 LB 1 2014 2014-01-12 13:00:00 27.2 LB1_2014
6 LB 1 2014 2014-01-12 14:00:00 27.1 LB1_2014
使用 if / else 语句会给出以下警告:
Warning message:In if (.$Year == 2015 | .$Year == 2016) { : the condition has length > 1 and only the first element will be used
所以我尝试使用 ifelse 语句,但现在我收到一条错误消息:
Error in ifelse(.,.$Year == 2015 | .$Year == 2016,subset(row_number()%%2 == : (list) object cannot be coerced to type 'logical'
有人可以提供任何其他建议/帮助吗?
这是我代码的开头:
FloodednestsIncSub = group_by (TempData,nestID,nest,Year) %>%
ifelse (.$Year == 2015 | .$Year == 2016,subset(row_number() %% 2 == 1) ) %>%
mutate(TempDrop = Temp - lag(Temp,n=1,default = first(Temp))) %>%
mutate(Flooded = TempDrop < -0.45)
如果我在“subset(row_number() %% 2 == 1”之后添加一个逗号,并将其留空 - 否则只是转到下一行, 我收到一个不同的错误:
Error in ifelse(.,subset(row_number()%%2 == :
unused argument (alist())
我需要代码 如果年份是 2015 或 2016,则每隔一行跳过,然后转到下一行代码; 否则,只需转到下一行代码...
解决方法
如果每 30 分钟测量一次,您可以只在 30 分钟时过滤一次。 这将删除一半。 可以这样做:
TempData %>%
# Only keep whole hours
dplyr::filter(lubridate::minute(Datetime) == 0) %>%
# Rest of pipe
dplyr::mutate(
TempDrop = Temp - dplyr::lag(Temp,n=1,default = first(Temp)),Flooded = TempDrop < -0.45
)