【问题标题】:Trouble with subsetting with multiple conditions in RR中具有多个条件的子集问题
【发布时间】:2013-07-30 01:23:38
【问题描述】:

我正试图弄清楚为什么我不能在 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。

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

【问题讨论】:

  • "我的首选技术是#3" 为什么?因为它是语法糖?使用数据表。而且我认为关于warning,您应该将您的左任期强制为POSIXct,例如as.POSIXct("2008-01-01")

标签: r


【解决方案1】:

你可能想要

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

【讨论】:

  • 好,简单的建议。我认为这是某种简单的语法错误。
【解决方案2】:

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

对于#1,您需要在右括号前选定的行后面加一个逗号:, ]
对于#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)

【讨论】:

  • 我按照您的建议将逗号添加到 #1 并得到以下结果:[1] Epoch Distance BaselineVectorID (或 0-length row.names)。对于#3,在遵循您的建议后,我得到了与上面#2 相同的警告消息结果。我不指望你为我解决这个问题。我从下面 Hong Ooi 的回复中得到了很好的结果。
  • 尝试将 Rdataset$Epoch (data.frame) 或 Epoch (data.table) 包装在 as.Date(.) 中,无论哪种方式,请注意将 data.frame 与 data.table 混淆
  • 感谢您的澄清。你的方法也很有效,并帮助我发现了我的子集的另一个错误。本文中关于避免混淆data.framedata.table 的cmets 阐明了我需要了解它们的含义。我当然可以而且会查一下,但有人能用简单的话指出区别吗?
猜你喜欢
  • 1970-01-01
  • 2021-08-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多