在 R 中改变 case_when 日期时间数据

Mutate case_when date time data in R

我正在研究夜间活动的物种,并尝试按日期和时间段标记夜间记录的 GPS 定位。 GPS 定位在 19:00:00 一晚和第二天早上 05:00:00 之间记录了大约 80 天。每个晚上的时间跨度两天(很明显)。我想在晚上而不是日期组织修复,这样动物运动就不会在活跃期的中间分裂。我在让它正常工作时遇到问题。我想为一段时间内的几天(例如 1 周)创建一个带有 ID 的新列,但也想为每个单独的晚上创建一个列。

当我第一次读入数据时,它看起来如下所示(注意这不是我的数据,而是数据集及其结构中存在的 4 列的示例):

library(tidyverse)
library(magrittr)
library(lubridate)

data <- read_csv("data/gps-fixes.csv")
Fix_date_time Animal_ID Latitude Longitude
15/01/21 19:00 1 -20.67891 132.87652
15/01/21 20:00 1 -20.66652 132.88912
15/01/21 21:00 1 -20.68752 132.92312
15/01/21 22:00 1 -20.64652 132.88912
15/01/21 23:00 1 -20.70652 132.88812
16/01/21 00:00 1 -20.78652 132.88712
16/01/21 01:00 1 -20.78652 132.88712
16/01/21 02:00 1 -20.78652 132.88712
16/01/21 03:00 1 -20.78652 132.88712
16/01/21 04:00 1 -20.78652 132.88712
16/01/21 05:00 1 -20.78652 132.88712

Fix_date_time 作为 col_character() 读入,其他三个变量是 col_double() 首次读入的日期显示为 DMY H:M

然后我使用 lubridate

将日期和时间转换为 date/time 日期
data$Fix_date_time <- dmy_hm(data$Fix_date_time)

其中returns以下

Fix_date_time Animal_ID Latitude Longitude
2021-01-15 19:00:00 1 -20.67891 132.87652
2021-01-15 20:00:00 1 -20.66652 132.88912
2021-01-15 21:00:00 1 -20.68752 132.92312
2021-01-15 22:00:00 1 -20.64652 132.88912
2021-01-15 23:00:00 1 -20.70652 132.88812
2021-01-16 00:00:00 1 -20.78652 132.88712
2021-01-16 01:00:00 1 -20.78652 132.88712
2021-01-16 02:00:00 1 -20.78652 132.88712
2021-01-16 03:00:00 1 -20.78652 132.88712
2021-01-16 04:00:00 1 -20.78652 132.88712
2021-01-16 05:00:00 1 -20.78652 132.88712

日期时间随后显示为 dttm 矢量。

如果我随后尝试从多个晚上创建一个新列,我会得到不正确的输出。 如果我输入以下代码:

data %<>% 
mutate(period = case_when(
       (Fix_date_time >= 2021-01-15 19:00:00) & (Fix_date_time <= 2021-01-21 05:00:00) ~ "Period-1",
       (Fix_date_time >= 2021-01-21 19:00:00) & (Fix_date_time <= 2021-01-28 05:00:00) ~ "Period-2",
       (Fix_date_time >= 2021-01-29 19:00:00) & (Fix_date_time <= 2021-02-02 05:00:00) ~ "Period-3"))

我改为在结束日期前一天晚上 8 点左右结束的每个时间段内完成最后一次 GPS 定位(例如,对于“Period-1”,最后一次定位在 2021 年 22:00 左右- 01-21).但是,如果在每个期间的结束日期使其<= 19:00:00,它就可以工作。虽然这是目前的解决方法,但我想弄清楚我做错了什么以在将来修复它。

非常感谢:)

您需要比较相同的数据class。尝试以下操作:

library(dplyr)
library(magrittr)
library(lubridate)

data %<>% 
  mutate(period = case_when(
    Fix_date_time >= ymd_hms('2021-01-15 19:00:00') & 
    Fix_date_time <= ymd_hms('2021-01-21 05:00:00') ~ "Period-1",
    Fix_date_time >= ymd_hms('2021-01-21 19:00:00') & 
    Fix_date_time <= ymd_hms('2021-01-28 05:00:00') ~ "Period-2",
    Fix_date_time >= ymd_hms('2021-01-29 19:00:00') & 
    Fix_date_time <= ymd_hms('2021-02-02 05:00:00') ~ "Period-3"))