使用R,是否有更好的方法来收集具有多个系列记录的每个人的记录开始和结束的日期

VPMancy

我希望以一种简单的方式找到成千上万个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

然后使用此循环查找开始记录个人的每个日期,而几天之间不会停下来。在我的示例中,以“ 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的语法。

罗纳克·沙

您可以尝试在每个休息时创建一个新组,firstlast date在每个组中获取

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

每天将1个具有开始和结束日期的记录转换为多个记录

SELECT 具有开始日期和结束日期的记录

R中是否有更好的方法来拆分具有多个部分的文件

从具有开始和结束日期的记录列表中获取每个工作日的平均持续时间

是否有更好的方法来获得限制为1的随机记录

使用SQL Server中不同记录的开始日期和结束日期创建具有数据范围的临时表

如何在 R 的数据框中查找开始和结束日期以及为每列记录的总天数?

每个人具有多个/堆叠变量的热图

查询构建以查找所有一系列记录均具有值的记录

是否有一个sql查询来统计特定年份的人数,知道每个人的出生日期和死亡日期?

TSQL-在开始日期和结束日期之间的每个月的返回记录,即使该月没有可用数据

是否有比使用多个for循环更好的方法来解决此问题?

是否有内置的c#类来定义具有开始日期和结束日期的时间窗口?

使用 Groupby 删除 DataFrame 中每个 id 具有不同开始和结束日期的行

结合使用多处理和请求时,是否有更好的方法来避免内存泄漏?

有没有更好的方法来选择多个具有相同父元素的元素?

为什么每个人都使用带有ASP.Net Core ILogger的记录程序包?

是否有一种有效的方法来添加大量记录,而EF&SQL Server中不存在每个记录?

如何创建具有开始日期和结束日期的事件系列

锚数据库建模-有什么更好的方法来存储历史记录并允许回滚记录?

使用 Pest.rs,是否有更好的方法来组织包含或导入的多个文件中的语法?

是否有一种简单的方法来记录Shell脚本执行的所有活动?

更好的方法来破坏具有多个回报的Custom React Hooks?

pytransitions/transitions:有没有更好的方法来存储访问状态的历史记录?

有没有更好的方法来检查一系列输入是否匹配某个停止条件?

indexOf():是否有更好的方法来实现呢?

是否有更好的方法来减轻此警告?

是否有更好的方法来仅检索模型值?

是否有更好的方法来设置产生随机数和控制限制的几率?