R:dplyr::filter&;base::`[`无法处理列类型ts
我试图从RR:dplyr::filter&;base::`[`无法处理列类型ts,r,dplyr,R,Dplyr,我试图从Rdata.frame中filter行(在dplyr术语中),但在使用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 = "da
data.frame
中filter
行(在dplyr
术语中),但在使用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
中的行而不更改列类型吗
另一个问题是为什么函数的行为是这样的
谢谢。如果我们检查
[
methods(`[`)[51]
#[1] "[.ts"
根据?ts
类“ts”有许多方法,特别是算术方法
将尝试对齐时间轴,并进行子集设置以提取子集
可以使用of系列(例如,“EuStockMarkets[,“DAX”])。但是,
将第一个(或唯一)维度子集将返回一个矩阵或
向量,以及矩阵子集。子赋值可用于
替换值,但不扩展系列(请参见“窗口”)。此处
是将级数转换为矩阵(a)的“t”方法
一列矩阵(如果是向量),因此返回的结果
不从类“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 ...
dfTest2=截止日期('2014-02-01'),]
str(dfTest2)
#“数据帧”:4个变量中的29个:
#$dates:日期,格式:“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.30.231 1.08。。。
dfTest2[,4]我不知道行为变化的原因,可能子集设置后的ts
需要将序列从1:60
更改为从1:29
。您可以稍后修改dfTest2[,4]@akrun解释得通——谢谢。不确定期望这种行为是否有意义。另外,请注意,base::subset
的行为与base::`[`
的行为相同。subset
是[
。对于默认选项如drop=FALSE
非常有用。根据?subset
,这是一个便于交互使用的功能。对于编程,最好使用标准的子集功能,如'[”,尤其是参数“子集”的非标准评估可能会产生意想不到的后果。
@akrun因此,“如预期的那样”。-)