在 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"))
我正在研究夜间活动的物种,并尝试按日期和时间段标记夜间记录的 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"))