R 编写一个函数来覆盖大列表
基本上,我有一个大的时间序列数据帧在几天内。我曾经写过一些代码,在数据帧中一次只能运行一天,但现在我想对其进行调整,使其能够运行所有天。对于我的数据框中的每一天,都有一列包含当天的日出时间,还有一列包含日落时间。我想用这些时间把每天分成白天和晚上。我的日出日落柱看起来是这样的,每天都不同:R 编写一个函数来覆盖大列表,r,dataframe,time-series,lapply,R,Dataframe,Time Series,Lapply,基本上,我有一个大的时间序列数据帧在几天内。我曾经写过一些代码,在数据帧中一次只能运行一天,但现在我想对其进行调整,使其能够运行所有天。对于我的数据框中的每一天,都有一列包含当天的日出时间,还有一列包含日落时间。我想用这些时间把每天分成白天和晚上。我的日出日落柱看起来是这样的,每天都不同: Sunrise Sunset 2010-01-19 08:55:12 2010-01-19 17:26:34 我使用split将数据框按日期划分,得到一个包含10个元素(天)的大列
Sunrise Sunset
2010-01-19 08:55:12 2010-01-19 17:26:34
我使用split将数据框按日期划分,得到一个包含10个元素(天)的大列表
我希望我的输出包含每个日期的活动表,例如:
2010-01-19
1 0
2 0
2010-01-20
1 0
2 3
我不太确定,因为你的问题很模糊,但我认为你可以这样做:
DF <- read.table(text="Date, Time, Activity, Sunrise, Sunset
2010-01-19, 23:58:00, 1, 2010-01-19 08:55:12, 2010-01-19 17:26:34
2010-01-19, 23:59:00, 1, 2010-01-19 08:55:12, 2010-01-19 17:26:34
2010-01-19, 00:00:00, 0, 2010-01-19 08:55:12, 2010-01-19 17:26:34
2010-01-19, 00:01:00, 0, 2010-01-19 08:55:12, 2010-01-19 17:26:34
2010-01-19, 09:01:00, 0, 2010-01-19 08:55:12, 2010-01-19 17:26:34
2010-01-20, 00:02:00, 1, 2010-01-20 08:54:13, 2010-01-20 17:28:11
2010-01-20, 00:03:00, 0, 2010-01-20 08:54:13, 2010-01-20 17:28:11
2010-01-20, 00:04:00, 1, 2010-01-20 08:54:13, 2010-01-20 17:28:11", header=TRUE, sep=",")
DF$datetime <- as.POSIXct(paste(DF$Date, DF$Time), "%Y-%m-%d %H:%M:%S", tz="GMT")
DF$date <- as.Date(DF$datetime)
DF$Sunrise <- as.POSIXct(DF$Sunrise, "%Y-%m-%d %H:%M:%S", tz="GMT")
DF$Sunset <- as.POSIXct(DF$Sunset, "%Y-%m-%d %H:%M:%S", tz="GMT")
DF$day <- (DF$datetime > DF$Sunrise) & (DF$datetime < DF$Sunset)
# Date Time Activity Sunrise Sunset datetime day date
#1 2010-01-19 23:58:00 1 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 23:58:00 FALSE 2010-01-19
#2 2010-01-19 23:59:00 1 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 23:59:00 FALSE 2010-01-19
#3 2010-01-19 00:00:00 0 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 00:00:00 FALSE 2010-01-19
#4 2010-01-19 00:01:00 0 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 00:01:00 FALSE 2010-01-19
#5 2010-01-19 09:01:00 0 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 09:01:00 TRUE 2010-01-19
#6 2010-01-20 00:02:00 1 2010-01-20 08:54:13 2010-01-20 17:28:11 2010-01-20 00:02:00 FALSE 2010-01-20
#7 2010-01-20 00:03:00 0 2010-01-20 08:54:13 2010-01-20 17:28:11 2010-01-20 00:03:00 FALSE 2010-01-20
#8 2010-01-20 00:04:00 1 2010-01-20 08:54:13 2010-01-20 17:28:11 2010-01-20 00:04:00 FALSE 2010-01-20
table(DF[,c("date", "Activity", "day")])
#, , day = FALSE
#
# Activity
#date 0 1
# 2010-01-19 2 2
# 2010-01-20 1 2
#
#, , day = TRUE
#
# Activity
#date 0 1
# 2010-01-19 1 0
# 2010-01-20 0 0
DF您正在尝试重新发明轮子。使用R的datetime工具和包,如plyr、dplyr或data.table。如果你清楚地陈述了你的最终目标,并在你的问题中添加了示例数据(例如,使用dput(head(df))
),那么应该有人能够向你展示如何轻松地做到这一点。你的示例输出表与示例输入有何关联?每天都应该生成一个活动值表。即每天1的总数和0的总数。错误消息告诉您函数daynight
需要有一个参数<代码>日夜我看到2010-01-19有两个1
和两个0
。日出/日落时间的关系在哪里?
2010-01-19
1 0
2 0
2010-01-20
1 0
2 3
DF <- read.table(text="Date, Time, Activity, Sunrise, Sunset
2010-01-19, 23:58:00, 1, 2010-01-19 08:55:12, 2010-01-19 17:26:34
2010-01-19, 23:59:00, 1, 2010-01-19 08:55:12, 2010-01-19 17:26:34
2010-01-19, 00:00:00, 0, 2010-01-19 08:55:12, 2010-01-19 17:26:34
2010-01-19, 00:01:00, 0, 2010-01-19 08:55:12, 2010-01-19 17:26:34
2010-01-19, 09:01:00, 0, 2010-01-19 08:55:12, 2010-01-19 17:26:34
2010-01-20, 00:02:00, 1, 2010-01-20 08:54:13, 2010-01-20 17:28:11
2010-01-20, 00:03:00, 0, 2010-01-20 08:54:13, 2010-01-20 17:28:11
2010-01-20, 00:04:00, 1, 2010-01-20 08:54:13, 2010-01-20 17:28:11", header=TRUE, sep=",")
DF$datetime <- as.POSIXct(paste(DF$Date, DF$Time), "%Y-%m-%d %H:%M:%S", tz="GMT")
DF$date <- as.Date(DF$datetime)
DF$Sunrise <- as.POSIXct(DF$Sunrise, "%Y-%m-%d %H:%M:%S", tz="GMT")
DF$Sunset <- as.POSIXct(DF$Sunset, "%Y-%m-%d %H:%M:%S", tz="GMT")
DF$day <- (DF$datetime > DF$Sunrise) & (DF$datetime < DF$Sunset)
# Date Time Activity Sunrise Sunset datetime day date
#1 2010-01-19 23:58:00 1 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 23:58:00 FALSE 2010-01-19
#2 2010-01-19 23:59:00 1 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 23:59:00 FALSE 2010-01-19
#3 2010-01-19 00:00:00 0 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 00:00:00 FALSE 2010-01-19
#4 2010-01-19 00:01:00 0 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 00:01:00 FALSE 2010-01-19
#5 2010-01-19 09:01:00 0 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 09:01:00 TRUE 2010-01-19
#6 2010-01-20 00:02:00 1 2010-01-20 08:54:13 2010-01-20 17:28:11 2010-01-20 00:02:00 FALSE 2010-01-20
#7 2010-01-20 00:03:00 0 2010-01-20 08:54:13 2010-01-20 17:28:11 2010-01-20 00:03:00 FALSE 2010-01-20
#8 2010-01-20 00:04:00 1 2010-01-20 08:54:13 2010-01-20 17:28:11 2010-01-20 00:04:00 FALSE 2010-01-20
table(DF[,c("date", "Activity", "day")])
#, , day = FALSE
#
# Activity
#date 0 1
# 2010-01-19 2 2
# 2010-01-20 1 2
#
#, , day = TRUE
#
# Activity
#date 0 1
# 2010-01-19 1 0
# 2010-01-20 0 0