我正在尝试使用filter
来dplyr
行(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
的行而不更改列类型吗?
另一个问题是为什么函数的行为是这样的。
感谢。
答案 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 ...