Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:dplyr::filter&;base::`[`无法处理列类型ts_R_Dplyr - Fatal编程技术网

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

R: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

我试图从R
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因此,“如预期的那样”。-)