2

我试图弄清楚为什么我不能在 R 中进行子集化。

我的数据集 Rdataset 有 3 列:Epoch、Distance 和 BaselineVectorID。我想做的是根据时代的多个条件对距离进行子集化。我查看了 StackOverflow 上的多个问答,并在我的数据集上尝试了许多响应,但都没有奏效。这是背景:

首先,使用 Epoch 从 2007-11-15 到 2011-03-30 我设置

StartDate <- "2008-01-01"
as.numeric(as.Date(StartDate)); StartDate

然后我量化时间窗口的持续时间

ShortTermDuration <-  30
LongTermDuration  <- 365

然后我定义时间窗口,

MonthAhead  <- as.Date(StartDate) + ShortTermDuration;  MonthAhead
MonthBehind <- as.Date(StartDate) - ShortTermDuration; MonthBehind

然后我想通过子集定义较小的数据集,并尝试了以下每种不同的方法以及相关的结果:

1.

Rdataset[Rdataset$Epoch >= "2008-01-01" & Rdataset$Epoch < "2008-02-01"]

结果:

data frame with 0 columns and 703 rows

2.

ShortTermDataset <- subset(Rdataset, Epoch>=MonthBehind & Epoch<=MonthAhead)

结果:

Warning messages:
1: In eval(expr, envir, enclos) :
Incompatible methods ("Ops.POSIXt", "Ops.Date") for ">="
2: In eval(expr, envir, enclos) :
Incompatible methods ("Ops.POSIXt", "Ops.Date") for "<="
[1] Epoch            Distance         BaselineVectorID
<0 rows> (or 0-length row.names)

3.

ShortTerm.df <- Rdataset[Epoch>=MonthBehind & Epoch<MonthAhead, ]

结果:

Error in `[.data.frame`(Rdataset, Epoch >= MonthBehind & Epoch < MonthAhead,  : 
object 'Epoch' not found

所以这些方法都不起作用。我的首选技术是#3。

为了清楚起见,我的问题是如何使用我喜欢的方法或其他方法之一进行子集化?

4

2 回答 2

1

你可能想要

ShortTermDataset <- subset(Rdataset, as.Date(Epoch) >=MonthBehind &
                                     as.Date(Epoch) <=MonthAhead)
于 2013-07-30T01:32:06.483 回答
1

这些失败的原因(特别是#1and #3)是因为您使用data.table的语法带有data.frame

For #1,在右括号之前选择的行之后需要一个逗号: , ]
For #3

data.frame句法:

ShortTerm.df <- 
 Rdataset[Rdataset$Epoch>=MonthBehind & Rdataset$Epoch<MonthAhead, ]

要使用data.table语法转换为 data.table:

library(data.table)
Rdataset <- data.table(Rdataset)
ShortTerm.df <- Rdataset[Epoch>=MonthBehind & Epoch<MonthAhead, ]

(值得注意的是data.tables 可以使用任何一种语法,因为data.tables 也是data.frames)

于 2013-07-30T01:59:27.750 回答