Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.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_For Loop_Tidyverse_Lubridate - Fatal编程技术网

R 循环通过日期时间的数据帧

R 循环通过日期时间的数据帧,r,for-loop,tidyverse,lubridate,R,For Loop,Tidyverse,Lubridate,我正在尝试为卫星发射器创建GPS时间表,用于跟踪我正在研究的鸟类的迁徙。下面名为“sched_gps_fixes”的函数获取日期时间向量并将其写入.ASF文件,该文件将上载到卫星发射机。这会告诉发射器进行GPS定位的日期和时间。使用R和sched_gps_fixes功能,我可以快速创建一个从一年中任何一天开始的gps计划。发射机附带的软件也可以做到这一点,但我必须仔细选择发射机获取GPS位置的每个时间和日期 所以我想:1创建一个数据帧,其中包含2018年的每一天,以及我希望发射器收集GPS位置的

我正在尝试为卫星发射器创建GPS时间表,用于跟踪我正在研究的鸟类的迁徙。下面名为“sched_gps_fixes”的函数获取日期时间向量并将其写入.ASF文件,该文件将上载到卫星发射机。这会告诉发射器进行GPS定位的日期和时间。使用R和sched_gps_fixes功能,我可以快速创建一个从一年中任何一天开始的gps计划。发射机附带的软件也可以做到这一点,但我必须仔细选择发射机获取GPS位置的每个时间和日期

所以我想:1创建一个数据帧,其中包含2018年的每一天,以及我希望发射器收集GPS位置的时间,2使用数据帧的每一行作为一系列日期时间的开始日期,例如从2018-03-25 12:00:00开始,我想创建一个GPS计划,每隔一天获取一个GPS点,因此2018-03-25 12:00:00、2018-03-27 12:00:00等,并为每个GPS计划创建一个.ASF文件。下面是我试图实现的目标的简化版本:

library(lubridate)

# set the beginning time
start_date <- ymd_hms('2018-01-01 12:00:00')

# create a sequence of datetimes starting January 1
days_df <- seq(ymd_hms(start_date), ymd_hms(start_date+days(10)), by='1 days')
tz(days_df) <- "America/Chicago"
days_df <- as.data.frame(days_df)
days_df

# to reproduce the example
days_df <- structure(list(days_df = structure(c(1514829600, 1514916000, 
1515002400, 1515088800, 1515175200, 1515261600, 1515348000, 1515434400, 
1515520800, 1515607200, 1515693600), class = c("POSIXct", "POSIXt"
), tzone = "America/Chicago")), .Names = "days_df", row.names = c(NA, 
-11L), class = "data.frame")

# the data frame looks like this:

days_df
1  2018-01-01 12:00:00
2  2018-01-02 12:00:00
3  2018-01-03 12:00:00
4  2018-01-04 12:00:00
5  2018-01-05 12:00:00
6  2018-01-06 12:00:00
7  2018-01-07 12:00:00
8  2018-01-08 12:00:00
9  2018-01-09 12:00:00
10 2018-01-10 12:00:00
11 2018-01-11 12:00:00
然后,每个矢量或GPS计划将以“GPS_计划”的形式在以下功能中运行,以创建变送器的.ASF文件:

sched_gps_fixes(gps_schedule, tz = "America/Chicago", out_file = "./gps_fixes")
所以我想知道如何创建一个for循环,为2018年的每一天生成一个datetime向量。这是我尝试执行的伪代码:

# create a loop called 'create_schedules' to make the GPS schedules and produce a .ASF file for each day of 2018

create_schedules <- function(days_df) {

  for(row in 1:nrow(days_df)) {

    seq(ymd_hms(days_df[[i]]), ymd_hms(days_df[[i]]+days(10)), by='2 days')

  }
}

# run the function
create_schedules(days_df)
我猜我需要一个输出来存储每个向量,并根据它的开始日期命名,还有其他事情吗

谢谢

Jay

一个选项是使用mapply根据OP提供的计划定义为每一行生成计划:

library(lubridate)

# For the sample data max_date needs to be calculated. Otherwise to generate
# schedule for whole 2018 max_date can be taken as 31-Dec-2018.
max_date = max(days_df$days_df)

mapply(function(x)seq(x, max_date, by="2 days"),days_df$days_df) 

#Result : Only first 3 items from the list generated. It will continue 
# [[1]]
# [1] "2018-01-01 12:00:00 CST" "2018-01-03 12:00:00 CST" "2018-01-05 12:00:00 CST"
# [4] "2018-01-07 12:00:00 CST" "2018-01-09 12:00:00 CST" "2018-01-11 12:00:00 CST"
# 
# [[2]]
# [1] "2018-01-02 12:00:00 CST" "2018-01-04 12:00:00 CST" "2018-01-06 12:00:00 CST"
# [4] "2018-01-08 12:00:00 CST" "2018-01-10 12:00:00 CST"
# 
# [[3]]
# [1] "2018-01-03 12:00:00 CST" "2018-01-05 12:00:00 CST" "2018-01-07 12:00:00 CST"
# [4] "2018-01-09 12:00:00 CST" "2018-01-11 12:00:00 CST"
# ....
# ....
# ....
# [[10]]
# [1] "2018-01-10 12:00:00 CST"
# 
# [[11]]
# [1] "2018-01-11 12:00:00 CST"
如果OP希望结果列表中的项目具有名称,则mapply可以用作:

更新:根据OP的请求生成启动+10天的计划。10天相当于10*24*3600秒


感谢您添加data.frame的详细信息。我不确定你最后期望的结果是什么?主要是为每一行创建一个向量的数据帧比较混乱。你能解释一下吗?是的,对不起,我没解释清楚。所以我想我需要的是一年中每一天的向量。那么从2018-01-01开始的GPS计划,从2018-01-02开始的GPS计划,等等,像这样:2018-01-01\u计划所有天的时间都是固定的吗?或者,您是否希望每天的日程安排会有所不同?其实我不知道你为什么需要这么多的平行时间表?@Jason每个向量应该有多少个日期?您已经显示了2018-01-01 12:00:00 UTC 2018-01-03 12:00:00 UTC 2018-01-05 12:00:00 UTC 2018-01-07 12:00:00 UTC 2018-01-09 12:00:00 UTC 2018-01-11 12:00:00 UTC,因此每个向量将包括6个日期?@MKR我想要每天的时间表,因为我们可能会在一年的任何一天捕捉一只鸟并将卫星发射器连接到它。通过这种方式,我们可以很容易地从一个时间表列表上传GPS时间表,该列表从我们捕获鸟的特定日期开始。这正接近我想要的,但我希望时间表的天数相同。在上面的列表中,[[11]]只包含一个日期。我试着修改你的代码,使max date等于开始日期加上10天,但这似乎也不能满足我的要求…@Jason,这很简单。我可以修改我的答案,以便它能按照你的要求完成工作。让我写一个单独的函数来解释清楚。@Jason看一看
library(lubridate)

# For the sample data max_date needs to be calculated. Otherwise to generate
# schedule for whole 2018 max_date can be taken as 31-Dec-2018.
max_date = max(days_df$days_df)

mapply(function(x)seq(x, max_date, by="2 days"),days_df$days_df) 

#Result : Only first 3 items from the list generated. It will continue 
# [[1]]
# [1] "2018-01-01 12:00:00 CST" "2018-01-03 12:00:00 CST" "2018-01-05 12:00:00 CST"
# [4] "2018-01-07 12:00:00 CST" "2018-01-09 12:00:00 CST" "2018-01-11 12:00:00 CST"
# 
# [[2]]
# [1] "2018-01-02 12:00:00 CST" "2018-01-04 12:00:00 CST" "2018-01-06 12:00:00 CST"
# [4] "2018-01-08 12:00:00 CST" "2018-01-10 12:00:00 CST"
# 
# [[3]]
# [1] "2018-01-03 12:00:00 CST" "2018-01-05 12:00:00 CST" "2018-01-07 12:00:00 CST"
# [4] "2018-01-09 12:00:00 CST" "2018-01-11 12:00:00 CST"
# ....
# ....
# ....
# [[10]]
# [1] "2018-01-10 12:00:00 CST"
# 
# [[11]]
# [1] "2018-01-11 12:00:00 CST"
mapply(function(x, y)seq(y, y+10*24*3600, by="2 days"),
    as.character(days_df$days_df), days_df$days_df, 
    SIMPLIFY = FALSE,USE.NAMES = TRUE) 

#Result
# $`2018-01-01 12:00:00`
# [1] "2018-01-01 12:00:00 CST" "2018-01-03 12:00:00 CST" "2018-01-05 12:00:00 CST"
# [4] "2018-01-07 12:00:00 CST" "2018-01-09 12:00:00 CST" "2018-01-11 12:00:00 CST"
#.......
#.......
#.......so on