找到第一行,之后 x 行满足 R 中的某些标准

Finding the first row after which x rows meet some criterium in R

一个数据争论问题:

我有一个每小时动物跟踪点的数据框,其中包含 ID、时间以及动物是在陆地上还是在水中的列(0 = 水;1 = 陆地)。它看起来像这样:

set.seed(13)
n <- 100
dat <- data.frame(id = rep(1:5, each = 10),
                  datetime=seq(as.POSIXct("2020-12-26 00:00:00"), as.POSIXct("2020-12-30 3:00:00"), by = "hour"),
                  land = sample(0:1, n, replace = TRUE))

我需要做的是标记第一行,此后动物连续 3 天至少使用一次土地。我试过这样做:


dat$ymd <- ymd(dat$datetime[1]) # make column for year-month-day

# add land points within each id group

land.pts <- dat %>% 
  group_by(id, ymd) %>%
  arrange(id, datetime) %>%
  drop_na(land) %>%
  mutate(all.land = cumsum(land))

#flag days that have any land points

flag <- land.pts %>%
  group_by(id, ymd) %>%
  arrange(id, datetime) %>%
  slice(n()) %>%
  mutate(flag = if_else(all.land == 0,0,1))

# Combine flagged dataframe with full dataframe

comb <- left_join(land.pts, flag)
comb[is.na(comb)] <- 1

然后我尝试了这个:

x = comb %>% 
  group_by(id) %>% 
  arrange(id, datetime) %>% 
  mutate(time.land=ifelse(land==0 | is.na(lag(land)) | lag(land)==0 | flag==0, 
                          0,
                          difftime(datetime, lag(datetime), units="days"))) 

但我仍然不太清楚要怎么做才能做到这一点,这样我才能弄清楚这只动物何时连续三天至少登陆过一次陆地,然后将第一个点标记为土地。非常感谢您提供的任何帮助!

根据时间戳创建一个日期列。汇总数据并为每个 iddate 仅保留 1 行,显示 animal 是否在一整天内是否在陆地上一次。

使用 zoorollapply 函数将第一天标记为 TRUE 如果接下来的 3 天动物在陆地上。

library(dplyr)
library(zoo)

dat <- dat %>% mutate(date = as.Date(datetime))

dat %>%
  group_by(id, date) %>%
  summarise(on_land = any(land == 1)) %>%
  mutate(consec_three = rollapply(on_land, 3,all, align = 'left', fill = NA)) %>%
  ungroup %>%
  #If you want all the rows of the data
  left_join(dat, by = c('id', 'date'))