2014-08-27 151 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