2013-10-29 14 views
4

我想子集的数据帧,以保持仅观测其中是偶数。子集POSIXct时间由奇数或偶数秒

您可以下载我的数据here(100行)的一小部分。

第6行是这样的:

  Timestamp C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 C13 C14 
1 2013-04-01 00:00:00 0 1 1 1 1 0 1 1 1 1 0 1 0 1 
2 2013-04-01 00:00:01 0 1 1 1 1 0 1 1 1 1 0 1 0 1 
3 2013-04-01 00:00:02 0 1 1 1 1 0 1 1 1 1 0 1 0 1 
4 2013-04-01 00:00:03 0 1 1 1 1 0 1 1 1 1 0 1 0 1 
5 2013-04-01 00:00:04 0 1 1 1 1 0 1 1 1 1 0 1 0 1 
6 2013-04-01 00:00:05 0 1 1 1 1 0 1 1 1 1 0 1 0 1 

而且我想它看起来就像这样:

  Timestamp C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 C13 C14 
1 2013-04-01 00:00:00 0 1 1 1 1 0 1 1 1 1 0 1 0 1 
2 2013-04-01 00:00:02 0 1 1 1 1 0 1 1 1 1 0 1 0 1 
3 2013-04-01 00:00:04 0 1 1 1 1 0 1 1 1 1 0 1 0 1 
4 2013-04-01 00:00:06 0 1 1 1 1 0 1 1 1 1 0 1 0 1 
5 2013-04-01 00:00:08 0 1 1 1 1 0 1 1 1 1 0 1 0 1 
6 2013-04-01 00:00:10 0 1 1 1 1 0 1 1 1 1 0 1 0 1 

我明白如何从herehere子集的时间间隔,但我一直没有找到与我的问题类似的例子,坦率地说,我不知道从哪里开始。

谢谢!

注意:时间戳变量已被格式化为POSIXct。

回答

1

无需使用任何外部包装,你可以做(​​甚至)

res = df[(as.numeric(substr(df$Timestamp, 18, 19)) %% 2) == 0,] 

出于测试目的,我用你的数据帧的一小部分:

df = data.frame(Timestamp = c("2013-04-01 00:00:00", "2013-04-01 00:00:01", "2013-04-01 00:00:02", "2013-04-01 00:00:03", "2013-04-01 00:00:04"), C01 = rep(0,5), C02 = rep(1,5)) 
df$Timestamp = as.POSIXct(df$Timestamp) 

这里是你获得什么(甚至):

#> res 
#   Timestamp C01 C02 
#1 2013-04-01 00:00:00 0 1 
#3 2013-04-01 00:00:02 0 1 
#5 2013-04-01 00:00:04 0 1 

对于奇数,同样的逻辑被替换==0应用通过==1

+0

谢谢玛丽亚姆! – amzu

+0

我的荣幸!!如果你想提取月份或年份,你可以对'substr'使用不同的限制! – Mayou

+4

日期上的字符串操作。 **不寒而栗** – hadley

4
library(lubridate) 

foo <- seq(as.POSIXct("2013-01-10"), as.POSIXct("2013-01-11"), by = "secs") 

secs <- second(foo) 

even <- foo[secs %% 2 == 0] 
odd <- foo[secs %% 2 == 1] 

您的下载链接是不是为我工作,所以我没有使用你的数据,但你应该能够子集的data.frame以同样的方式。

+0

我与许多个月的工作,但只用了一个月的时间,是有办法foo定义,以便它可以容纳不同的月份?年份? – amzu

+0

如果你问如何根据偶数和奇数月到子集/年,那么你应该看看'?month'和'?year'在'lubridate'并用这些功能 –

+0

杰克在一个第二替代,我想知道如果有一种独立于月/年的工作方式,并且仍然以秒为单位。玛丽亚姆的回答完全符合我的需求,但感谢您的帮助。 – amzu

4

一个base替代:

tt <- c(Sys.time(), Sys.time() + 1) 
tt 
# [1] "2013-10-29 19:43:26 CET" "2013-10-29 19:43:27 CET" 

tt[as.numeric(format(tt, "%S")) %% 2 == 0] 
# [1] "2013-10-29 19:43:26 CET" 

更新以更快的替代感谢@Roland

tt[round(as.POSIXlt(tt)$sec) %% 2 == 0] 
+1

'tt [round(as.POSIXlt(tt)$ sec)%% 2 == 0]'更快。 – Roland

+0

@罗兰,非常感谢您的评论。我将它添加到我的答案中。干杯。 – Henrik

5

我加入一个答案,因为,尽管所有的回答都不错,他们都不承认POSIXct对象,当转换为整数,其实都是以秒为单位(从1970年1月1日)的事实,所以真的以下工作(但不会如果哟ü试图挑选奇数和偶数分钟,小时,...):

a <- seq(as.POSIXct("2013-04-01 00:00:00"),as.POSIXct("2013-04-01 01:00:00"),by="secs") 
a[as.integer(a)%%2==0]