Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以在R中分割时间和持续时间变量,同时保持其他变量不变?_R_Dataframe_Datetime - Fatal编程技术网

有没有一种方法可以在R中分割时间和持续时间变量,同时保持其他变量不变?

有没有一种方法可以在R中分割时间和持续时间变量,同时保持其他变量不变?,r,dataframe,datetime,R,Dataframe,Datetime,我有一个数据集,我现在想在中午12:00pm分为两部分,即,如果变量从08:00-13:00开始,它会变成08:00-12:00和12:00-13:00,跨越两行。变量持续时间和累计总和需要相应更改,但其他变量应与原始变量相同 这应该适用于不同的id变量 id = unchanged from row 1, just repeated start = changed in both rows end = changed in both rows day = unchanged from row

我有一个数据集,我现在想在中午12:00pm分为两部分,即,如果变量从08:00-13:00开始,它会变成08:00-12:00和12:00-13:00,跨越两行。变量持续时间和累计总和需要相应更改,但其他变量应与原始变量相同

这应该适用于不同的id变量

id = unchanged from row 1, just repeated
start = changed in both rows
end = changed in both rows
day = unchanged from row 1, just repeated
duration = changed in both rows
cumulative time = changed in both row

ORIGINAL DATAFILE
#Current dataframe
id<-c("m1","m1")
x<-c("2020-01-03 10:00:00","2020-01-03 19:20:00")
start<-strptime(x,"%Y-%m-%d %H:%M:%S")
y<-c("2020-01-03 16:00:00","2020-01-03 20:50:00")
end<-strptime(y,"%Y-%m-%d %H:%M:%S")
day<-c(1,1)
mydf<-data.frame(id,start,end,day)
# calculate duration and time
mydf$duration<-as.numeric(difftime(mydf$end,mydf$start,units = "hours"))
mydf$time<-c(cumsum(mydf$duration))

REQUIRED DATAFILE
#Required dataframe
id2<-c("m1","m1","m1")
x2<-c("2020-01-03 10:00:00","2020-01-03 12:00:00","2020-01-03 19:20:00")
start2<-strptime(x2,"%Y-%m-%d %H:%M:%S")
y2<-c("2020-01-03 12:00:00","2020-01-03 16:00:00","2020-01-03 20:50:00")
end2<-strptime(y2,"%Y-%m-%d %H:%M:%S")
day2<-c(1,1,1)
mydf2<-data.frame(id2,start2,end2,day2)
# calculate duration and time
mydf2$duration<-c(2,4,1.5)
mydf2$time<-c(2,6,7.5)

这里是我的解决方案,当你有许多不同日期的观察时,它是一个更一般的情况。逻辑如下

首先,我创建了一个带有中午12:00pm拆分器的数据帧

接下来,我通过将数据帧连接到初始数据帧并将它们保存在单独的数据帧中来确定应该拆分的行

接下来,我复制行并创建拆分的行

从原始数据集中,我删除了拆分的行,并将正确的行合并在一起

图书馆弹琴 分割时间数据= tibblesplit_time=as.POSIXctseq0,365*60*60*24,60*60*24, 原点=2020-01-01 17:00:00%>% mutatekey=TRUE我使用17:00设置为东部时间12:00,根据您的目的进行调整 数据到分割= mydf%>% mutatekey=TRUE%>% 左联合拆分时间数据%>% 筛选器在拆分时间、开始、结束%>%之间 选择键 联吡啶酯 分割行= 数据到拆分%>% rbinddata\u到\u拆分%>% 安排开始%>% 组\u按开始%>% 变更行数=行数%>% 解组%>% mutatestart=如果其他编号==1,则开始,拆分时间, 结束=如果其他编号==1,拆分时间,结束%>% 选择行数,-拆分时间%>% mutateduration=hourend-hourstart mydf%>% 反链接数据到拆分%>% 全连接拆分行%>% 安排开始%>% 突变时间=持续时间 输出

  id               start                 end day duration time
1 m1 2020-01-03 10:00:00 2020-01-03 12:00:00   1      2.0  2.0
2 m1 2020-01-03 12:00:00 2020-01-03 16:00:00   1      4.0  6.0
3 m1 2020-01-03 19:20:00 2020-01-03 20:50:00   1      1.5  7.5

好问题。因此,每一行隐式地包含一个或两个间隔,所以您应该能够在每一行上定义这些间隔,然后旋转到long,但是您还不能使用间隔值旋转?。因此,我的方法是,计算每一行最多两个班次的开始时间,然后从旋转后的下一个班次开始推断班次结束。在线评论

librarylubridate,warn.conflications=FALSE 图书馆管理员 librarymagrittr,warn.conflications=FALSE libraryhablar,warn.conflications=FALSE mydf A TIBLE:2 x 4 >我开始一天结束一天 > >1 m1 2020-01-03 10:00:00 2020-01-03 16:00:00 1 >2 m1 2020-01-03 19:20:00 2020-01-03 20:50:00 1 多年筹资框架2% 假设相关的中午截止时间与开始时间在同一天 突变日期= 开始%>%为\u日期%>% 添加12%>%小时%>% 调整到时间线%>% 如果班次不包括中午,则无相关中午 如果不是的话,那就不一样了在%intervalstart内,结束%>% 创建一个原始行ID,因为似乎没有,我们需要 在源于每个原始行的数据中构建间隔 行名到列名移位%>% pivot_longercols=开始、中午、结束、, 我们这里的时间戳将被视为开始时间 值_to=开始, 删除由于中午不相关而存在的行 值\u drop\u na=TRUE%>% 选择名称%>% 在定义的行内,推断班次结束时间作为下一班次的开始时间 按原来的班次 集团原班次%>% 安排开始%>% mutateend=leadstart%>% 解组%>% 删除表示上一个班次结束而非全班次结束的行 下降%>% 计算这些持续时间和时间,时间应该是全局的 累计的此外,您指定的mydf2第一次似乎不正确 价值 mutateduration=start%-%end%>%as.numerichours, 时间=持续时间%>% 选择ID、开始、结束、日期、持续时间、时间 >一个tibble:3x6 >id开始结束日持续时间 > >1 m1 2020-01-03 10:00:00 2020-01-03 12:00:00 12 >2 m1 2020-01-03 12:00:00 2020-01-03 16:00:00 14 6 >3 m1 2020-01-03 19:20:00 2020-01-03 20:50:00 11.57.5
由v0.3.0于2019-10-23创建,感谢您的回复。代码中出现当前错误:pivot__longer.,cols=cstart,midday,end,values_to=start,:找不到函数pivot_longer下载tidyr的devtools所需的函数我认为pivot_现在不再是版本tidyr的一部分-无需开发工具和/或从源代码构建。也许你只是没有从0.8.3更新tidyr?1.0版本是最近发布的。我在大约5分钟前更新了它,当时也在想同样的事情,非常感谢