4

我想对数据框进行子集化,以便仅保留秒数为偶数的观察结果。

您可以在此处下载我的一小部分数据(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

我了解如何从此处此处对时间间隔进行子集化,但我无法找到与我的问题类似的示例,坦率地说,我不知道从哪里开始。

谢谢!

注意:Timestamp变量已经被格式化为 POSIXct。

4

4 回答 4

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]
于 2013-10-29T20:21:04.457 回答
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]
于 2013-10-29T18:42:47.567 回答
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同样的方式对你的数据进行子集化。

于 2013-10-29T18:36:22.413 回答
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

于 2013-10-29T18:42:59.483 回答