有了R,是否有更好的方法来收集具有多个记录系列的每个人的记录开始和结束日期
我希望用一种简单的方式找到数千个ID开始被记录的日子,以及它们停止的日子 我目前使用的循环工作得很好,但需要很长时间,如下所示 我的数据集的一个示例:有了R,是否有更好的方法来收集具有多个记录系列的每个人的记录开始和结束日期,r,date,dplyr,R,Date,Dplyr,我希望用一种简单的方式找到数千个ID开始被记录的日子,以及它们停止的日子 我目前使用的循环工作得很好,但需要很长时间,如下所示 我的数据集的一个示例: id date 1 2017-11-30 1 2017-12-01 1 2017-12-02 1 2017-12-03 1 2017-12-05 1 2017-12-06 1 2017-12-07 1 2017-12-08 1 2017-12-09 1 2017-12-10 然后我使用这个循环来查找每个开始记录的日期,两天之
id date
1 2017-11-30
1 2017-12-01
1 2017-12-02
1 2017-12-03
1 2017-12-05
1 2017-12-06
1 2017-12-07
1 2017-12-08
1 2017-12-09
1 2017-12-10
然后我使用这个循环来查找每个开始记录的日期,两天之间没有停止。在我的例子中,以“2017-11-30”和“2017-12-05”为起点,以“2017-12-03”和“2017-12-10”为终点
nani <- unique(dat$id)
n <- length(dat$id)
#SET THE NEW OBJECT WHERE TO SAVE RESULTS
NEWDAT <- NULL
for(i in 1 : n)
{
#SELECT ANIMALS I WITHIN THE DATA.FRAME
x <- which(dat$id == nani[i])
#FIND THE POSITION IN THE DATA FRAME OF THE DAYS WHEN THE RECORD IS NOT CONTINUE
diffx <- diff(diff(dat$date[x]))
#FIND THE POSITION OF STARTS FOR EACH SESSIONS OF RECORDS
starti <- which(diffx < 0) +1
#FIND THE POSITION OF ENDS FOR EACH SESSIONS OF RECORDS
endi <- which(diffx > 0) +1
#FIND THE DATES OF STARTS FOR EACH SESSIONS OF RECORDS
starts_records <- c(dat$date[x][1], dat$date[x][starti])
#FIND THE DATES OF ENDS FOR EACH SESSIONS OF RECORDS
ends_records <- c(dat$date[x][endi], dat$date[x][length(x)])
#CREATE LABELS
name_start <- rep("START_RECORDS_BY_SENSORS", length(starts_records))
name_end <- rep("END_RECORDS_BY_SENSORS", length(ends_records))
#CREATE THE NEW DATA.FRAME EXPECTED
dat2 <- data.frame( "event_start" = c(starts_records, ends_records),
"name" = c(name_start, name_end))
dat2 <- dat2[order(dat2$event_start),]
#SAVE RESULTS
NEWDAT <- bind_rows(NEWDAT, dat2)
}
到目前为止,我尝试了以下方法,但没有找到避免循环的正确解决方案
NEWDAT <- dat %>% group_by(id) %>% summarize(diff_days = diff(diff(date)))
我仍然很难理解dplyr的语法。你可以尝试在每次休息时创建一个新的组,并在每个组中获得第一个和最后一个日期
library(dplyr)
df %>%
group_by(id, grp = cumsum(c(TRUE, diff(date) > 1))) %>%
summarise(start = first(date), stop = last(date))
# id grp start stop
# <int> <int> <date> <date>
#1 1 1 2017-11-30 2017-12-03
#2 1 2 2017-12-05 2017-12-10
您可以尝试在每次休息时创建一个新组,并获取每个组中的第一个和最后一个日期
library(dplyr)
df %>%
group_by(id, grp = cumsum(c(TRUE, diff(date) > 1))) %>%
summarise(start = first(date), stop = last(date))
# id grp start stop
# <int> <int> <date> <date>
#1 1 1 2017-11-30 2017-12-03
#2 1 2 2017-12-05 2017-12-10