在R中查找时间之间的差异

在R中查找时间之间的差异,r,time,difference,R,Time,Difference,我想计算“A”和“B”的时间差。我掌握的数据是个体睡觉时的小时/分钟/上午/下午(A)和醒来时的时间(B):(df称为时间) 我一直在做一些研究,我发现我可以创造一个角色的时间,然后改变它作为一个时间格式 首先,我使用unite()函数(tidyverse)连接hour(A)和min(A)。然后,我创建了另一个带有“假”日期的专栏(如果是pm:“2019-04-13”和am“2019-04-14”)。然后,我再次使用函数unite()连接日期和时间,并使用函数strtime()将类更改为time

我想计算“A”和“B”的时间差。我掌握的数据是个体睡觉时的小时/分钟/上午/下午(A)和醒来时的时间(B):(df称为时间)

我一直在做一些研究,我发现我可以创造一个角色的时间,然后改变它作为一个时间格式

首先,我使用unite()函数(tidyverse)连接hour(A)和min(A)。然后,我创建了另一个带有“假”日期的专栏(如果是pm:“2019-04-13”和am“2019-04-14”)。然后,我再次使用函数unite()连接日期和时间,并使用函数strtime()将类更改为time

对于hour(B)、min(B)和AMPM(B),我还使用了函数unite和join这三个列。然后我应用函数strptime()将类更改为时间

最后,我使用函数difftime()查找A和B之间的差异,但我不明白为什么会得到不寻常的结果


变异时间百分比(日期=ifelse(AMPM(A)=“AM”、“2019-04-14”、“2019-04-13”))
时间$Date%unite(唤醒时间、小时、分钟、九月=“:”)
#添加秒数

time$Sleeptime我们可以使用
粘贴
来组合时间(A)和时间(B)的片段,然后将
转换为.POSIXct
。使用
PM
从睡眠时间中减去
8.64e4
(以秒为单位的一天)。现在计算
apply
中的差异就很容易了

tmp <- sapply(list(1:3, 4:6), function(x) {
  cl <- as.POSIXct(apply(time[x], 1, paste, collapse=":"), format="%I:%M:%p")
  return(ifelse(time[tail(x, 1)] == "PM", cl - 8.64e4, cl))
  })
time <- cbind(time, `DIFF(min)`=apply(tmp, 1, diff)/60)
time
#   Hour(A) Min(A) AMPM(A) Hour(B) Min(B) AMPM(B) DIFF(min)
# 1       1     30      AM       7     30      AM       360
# 2       4      0      AM       9      0      AM       300
# 3      11     30      PM       6     30      AM       420

tmp谢谢你的回答。我试着去做,但我得到了其他的结果。例如,tmp的第一行:2019-05-14 01:00:00 2019-05-14 07:30:00,当我计算差异时,我得到:1404000。你知道会发生什么吗。。。另一件事是,当您使用as.POSIXct转换时,所有日期都是相同的。使用我的
时间
可以很好地工作。请将您的
dput(time)
添加到您的问题中作为编辑。例如,最后一行不起作用。解决方案应该是420,随着时间的推移,结果是-300。(这个例子应该是晚上11:30睡觉,早上6:30醒来)
    Hour(A) Min(A) AMPM(A) Hour(B) Min(B) AMPM(B) DIFF (min)
    1       30     AM      7       30     AM      300
    4       00     AM      9       00     AM      300
    11      30     PM      6       30     AM      420
tmp <- sapply(list(1:3, 4:6), function(x) {
  cl <- as.POSIXct(apply(time[x], 1, paste, collapse=":"), format="%I:%M:%p")
  return(ifelse(time[tail(x, 1)] == "PM", cl - 8.64e4, cl))
  })
time <- cbind(time, `DIFF(min)`=apply(tmp, 1, diff)/60)
time
#   Hour(A) Min(A) AMPM(A) Hour(B) Min(B) AMPM(B) DIFF(min)
# 1       1     30      AM       7     30      AM       360
# 2       4      0      AM       9      0      AM       300
# 3      11     30      PM       6     30      AM       420
time <- structure(list(`Hour(A)` = c(1L, 4L, 11L), `Min(A)` = c(30L, 
0L, 30L), `AMPM(A)` = c("AM", "AM", "PM"), `Hour(B)` = c(7L, 
9L, 6L), `Min(B)` = c(30L, 0L, 30L), `AMPM(B)` = c("AM", "AM", 
"AM")), row.names = c(NA, -3L), class = "data.frame")