我的问题很简单。我有每个行都是事件的表(月,日,小时,分钟给出)。但是,机器设置为24/7 记录。所以我有比我需要的更多事件(行)。 如何从白天删除多余的行,并且只保留从晚上(从日落到日出)的行? 可怕的是,日出/日落的时间每天都略有不同。
在这个例子中,我提供了两个表。首先是包含所有事件的表格,第二个包含每天日落/日出的时间。
如果可以提取,请注意每个晚上都包含两个日期 可能是在包含夜晚ID的表中插入的其他列? (见下面的方案)
# table with all events
my.table <- data.frame(event = 1:34,
day = rep(c(30,31,1,2,3), times = c(8,9,7,8,2)),
month = rep(c(3,4), each = 17),
hour = c(13,13,13,13,22,
22,23,23,2,2,2,
14,14,14,19,22,22,
2,2,2,14,15,22,22,
3,3,3,14,14,14,
23,23,2,14),
minute = c(11,13,44,55,27,
32,54,57,10,14,
26,12,16,46,30,
12,13,14,16,45,
12,15,12,15,24,
26,28,12,16,23,12,13,11,11))
# timings of sunset/sunrise for each day
sun.table <- data.frame(day = c(30,31,31,1,1,2,2,3),
month = rep(c(3,4), times = c(3,5)),
hour = rep(c(19,6), times = 4),
minute = c(30,30,31,29,32,
28,33,27),
type = rep(c("sunset","sunrise"), times = 4))
# rigth solution reduced table would contain only rows:
# 5,6,7,8,9,10,11,16,17,18,19,20,23,24,25,26,27,31,32,33.
# nrow("reduced table") == 20
答案 0 :(得分:1)
这是一种可能的策略
#convert sun-up, sun-down times to proper dates
ss <- with(sun.table, ISOdate(2000,month,day,hour,minute))
up <- ss[seq(1,length(ss),by=2)]
down <- ss[seq(2,length(ss),by=2)]
这里我假设桌子是有序的,以日出开始,来回交替,以日落结束。日期值也需要一年,这里我只是硬编码2000.只要您的数据不跨越年(或闰日)应该没问题,但您可能想要在实际年份流行你的观察结果。
现在为事件做同样的事情
tt <- with(my.table, ISOdate(2000,month,day,hour,minute))
在白天查找行
daytime <- sapply(tt, function(x) any(up<x & x<down))
并提取这些行
my.table[daytime, ]
# event day month hour minute
# 5 5 30 3 22 27
# 6 6 30 3 22 32
# 7 7 30 3 23 54
# 8 8 30 3 23 57
# 9 9 31 3 2 10
# 10 10 31 3 2 14
# 11 11 31 3 2 26
# 16 16 31 3 22 12
# 17 17 31 3 22 13
# 18 18 1 4 2 14
# 19 19 1 4 2 16
# 20 20 1 4 2 45
# 23 23 1 4 22 12
# 24 24 1 4 22 15
# 25 25 2 4 3 24
# 26 26 2 4 3 26
# 27 27 2 4 3 28
# 31 31 2 4 23 12
# 32 32 2 4 23 13
# 33 33 3 4 2 11
这里我们只获取日出之后和日落之前的值。由于sun.table
中没有足够的信息来确保第34行实际发生在子集之前,因此不会返回。