2014-08-27 129 views
4

我的问题很简单。我有桌子,每一行都是事件(月,日,小时,分钟)。但是,机器设置为24/712天记录。所以我有更多的事件(行)比我需要的。 如何从白天删除多余的行,并只保留从夜晚(从日落到日出)的行? 可怕的是,日出/日落的时机每天都略有不同从R中的时间数据中提取时间间隔

在这个例子中,我提供了两个表格。首先是所有事件的表格,其次包含每天日落/日出的时间。

如果可以提取,请注意每天晚上由来自两个日期可以插入包含夜间标识表中的附加列?(参见下面的方案)

enter image description here

# 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 
+1

'my.table'应该有一个小时的列吗? – 2014-08-27 23:52:40

+1

“sun.table”中每天都应该有日出日落吗? – 2014-08-28 00:18:29

+0

嗯,不一定。机器在傍晚前的第一天开始拍摄(第一天只有日落),晚上也拍摄结束(最后一天只有日出)。 “中间”的所有日子都有“日落”和“日出”的时间。如果你愿意的话,我可以添加时间,以便他们每天总是两次,或者邹可以只用上述表中的两个时间来对子集进行分组。如果这样的程序将简化提取过程,是否排除几天也没关系。 – 2014-08-28 00:25:55

回答

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.只要你的数据没有跨越几年(或闰日)应该没问题,但你可能想要在你的观察的实际年份弹出。

现在白天

daytime <- sapply(tt, function(x) any(up<x & x<down)) 

做同样的事件

tt <- with(my.table, ISOdate(2000,month,day,hour,minute)) 

查找行和提取这些行

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行实际发生在子集之前,因此不会返回。

+0

谢谢你@MrFlick!价值观真的很奇怪 - 它们完全是捏造的。我原来的桌子有超过100000行,我会尝试这个程序。那么指示夜间ID的列呢? – 2014-08-28 00:29:00

+0

哦,日期需要一年,所以在这里我只是硬编码2000.你应该改变你的观察的实际年。 – MrFlick 2014-08-28 00:32:06

+0

亲爱的@MrFlick。我担心你的回答不适合我的问题。我做了一些更新。如果你仍然感兴趣,请看看它。我也设置了赏金。 – 2014-08-31 00:40:02