找到第一行,之后 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")))
但我仍然不太清楚要怎么做才能做到这一点,这样我才能弄清楚这只动物何时连续三天至少登陆过一次陆地,然后将第一个点标记为土地。非常感谢您提供的任何帮助!
根据时间戳创建一个日期列。汇总数据并为每个 id
和 date
仅保留 1 行,显示 animal
是否在一整天内是否在陆地上一次。
使用 zoo
的 rollapply
函数将第一天标记为 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'))
一个数据争论问题:
我有一个每小时动物跟踪点的数据框,其中包含 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")))
但我仍然不太清楚要怎么做才能做到这一点,这样我才能弄清楚这只动物何时连续三天至少登陆过一次陆地,然后将第一个点标记为土地。非常感谢您提供的任何帮助!
根据时间戳创建一个日期列。汇总数据并为每个 id
和 date
仅保留 1 行,显示 animal
是否在一整天内是否在陆地上一次。
使用 zoo
的 rollapply
函数将第一天标记为 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'))