R:dplyr :: filter& base ::`[`无法处理列类型ts

时间:2015-04-13 06:37:52

标签: r dplyr

我正在尝试使用filterdplyr行(data.frame用语),并且使用base::`[`dplyr::filter遇到问题。这是一个例子:

library(magrittr)
library(dplyr)

dfTest = data.frame(dates = seq.Date(from = as.Date("2014-01-01"),
                                     to = as.Date("2014-03-01"), by = "day"), 
                    someNum1 = seq(1, 60, 1), 
                    someNum2 = rnorm(60))

# mutate one of the columns to give it type 'ts'
dfTest = dfTest %>% 
  dplyr::mutate(someNum2F = stats::filter(someNum2, c(0.1), "recursive"))
class(dfTest$someNum2F)

# try to filter with dplyr::filter
dfTest1 = dfTest %>% 
  dplyr::filter(dates >= as.Date("2014-02-01")) # Error: cannot deal with "ts" type columns

# try to filter with base::`[`
class(dfTest$someNum2F)
dfTest2 = dfTest[dfTest$dates >= as.Date(2014-02-01), ]
class(dfTest2$someNum2F)

请注意,dplyr::filter会对列类型产生阻塞,base::`[`会将列类型静静地更改为numeric。这对我来说似乎不太合适。

有人建议使用正确的方法来过滤data.frame的行而不更改列类型吗?

另一个问题是为什么函数的行为是这样的。

感谢。

1 个答案:

答案 0 :(得分:1)

如果我们检查methods [

 methods(`[`)[51]
 #[1] "[.ts"

根据?ts

中的说明
  

Class'" ts"'有许多方法。特别算术        将尝试对齐时间轴,并进行子集化以提取子集        可以使用系列(例如,'EuStockMarkets [," DAX"]')。然而,        对第一个(或唯一)维度进行子集化将返回矩阵或        向量,矩阵子集。子分配可用于        替换值但不扩展系列(参见“窗口”)。那里        是't'的方法,将系列转换为矩阵(a        单列矩阵(如果是向量)并因此返回结果        不继承自'" ts"'。

一种选择是在我们使用ts进行子集后重新转换为[类。如错误中所述,dplyr可能不支持ts类。

 dfTest2 <- dfTest[dfTest$dates >= as.Date('2014-02-01'), ]
 str(dfTest2)
 #'data.frame': 29 obs. of  4 variables:
 #$ dates    : Date, format: "2014-02-01" "2014-02-02" ...
 #$ someNum1 : num  32 33 34 35 36 37 38 39 40 41 ...
 #$ someNum2 : num  0.423 -1.673 -1.136 0.361 1.057 ...
 #$ someNum2F: num  0.365 -1.637 -1.3 0.231 1.08 ...

 dfTest2[,4] <- as.ts(dfTest2[,4])
 str(dfTest2)
 #'data.frame': 29 obs. of  4 variables:
 #$ dates    : Date, format: "2014-02-01" "2014-02-02" ...
 #$ someNum1 : num  32 33 34 35 36 37 38 39 40 41 ...
 #$ someNum2 : num  0.423 -1.673 -1.136 0.361 1.057 ...
 #$ someNum2F: Time-Series  from 1 to 29: 0.365 -1.637 -1.3 0.231 1.08 ...