2013-03-22 62 views
4

我有以下形式的数据帧:分割或子集数据转换成以30个分钟间隔

Temp Depth  Light x time date     time.at.depth 
104  18.59  -2.7 27 21:38 2012-06-20    4 
109  18.59  -2.7 27 22:02 2012-06-20    5 
110  18.75  -4.0 27 22:07 2012-06-20    5 
113  18.91  -2.7 27 22:21 2012-06-20    4 
114  18.91  -4.0 27 22:26 2012-06-20    5 
115  18.91  -2.7 27 22:31 2012-06-20    5 
117  18.91  -2.7 27 22:40 2012-06-20    4 
118  18.75  -4.0 27 22:45 2012-06-20    5 
119  18.75  -2.7 27 22:50 2012-06-20    5 
121  18.59  -4.0 27 22:59 2012-06-20    4 
122  18.75  -2.7 27 23:04 2012-06-20    5 
123  18.75  -4.0 27 23:09 2012-06-20    5 
126  18.59  -2.7 27 23:23 2012-06-20    5 
127  18.59  -2.7 27 23:28 2012-06-20    5 
128  18.59  -4.0 27 23:33 2012-06-20    5 
133  18.75  -4.0 27 23:57 2012-06-20    5 
136  18.59  -4.0 27 00:11 2012-06-20    5 
138  18.59  -2.7 27 00:21 2012-06-20    5 
140  18.91  -2.7 27 00:30 2012-06-20    5 

我想数据子集分为30分钟箱。是否有捷径可寻?我看着split()函数,但它似乎需要以数字格式才能正常工作,我有时间以POSIXct格式。任何想法将不胜感激。

+0

你看过cut()函数吗? – screechOwl 2013-03-23 13:03:44

+0

这看起来很相关:http://stackoverflow.com/questions/7528571/aggregate-count-occurences-of-values-over-arbitrary-timeframe – Ben 2013-03-24 23:43:37

回答

4

这里的一个单行你(dat是你的数据帧):

split(dat, cut(strptime(paste(dat$date, dat$time), format="%F %R"),"30 mins")) 

事实上cut.POSIXt接受为断点值

的间隔说明书中, “秒”, “分钟” 的一个,“小时”,“日”,“DSTday”,“星期”,“月”,“季度”或“年”,可选地以整数和空格开头,或者后面跟着“s”。

Additionnaly,我用%F %R作为快捷方式%Y-%m-%d %H:%M:看?strptime看到所有可能的格式。

+2

尽管有点警告,但在你给出的例子中,如果它的意思是按照正确的顺序,你午夜过后的价值应该改为“2012-06-21”,否则它们会被'strptime'错误翻译。 – plannapus 2013-03-25 07:35:29

+0

谢谢,这完美地将数据分成30分钟的间隔。有没有办法使用'apply()'或其他函数来查找每个间隔期间温度的平均值和标准误差? – user1997414 2013-03-26 12:08:27

+1

使用'lapply'。例如,如果您将我的答案的结果保存为'res':'lapply(res,function(x)mean(x $ Temp))'或'lapply(res,function(x)sd(x $ Temp))' 。 – plannapus 2013-03-26 12:20:05

相关问题