对于这样的数据框,我试图在特定日期范围内选择一些行:
nasdaq=read.csv("nasdaq.csv")
head(nasdaq)
Date Close.Price
1 2013-08-05 3692.95
2 2013-08-06 3665.77
3 2013-08-07 3654.01
4 2013-08-08 3669.12
5 2013-08-09 3660.11
6 2013-08-12 3669.95
到目前为止我尝试过的是:
chunk=subset(nasdaq,nasdaq$Date>=as.Date("2013-08-05") & nasdaq$Date<=as.Date("2018-08-03"))
警告消息:
1: In eval(e, x, parent.frame()) :
Incompatible methods ("Ops.factor", "Ops.Date") for ">="
2: In eval(e, x, parent.frame()) :
Incompatible methods ("Ops.factor", "Ops.Date") for "<="
我也尝试过...
chunk=nasdaq[nasdaq$Date>=as.Date("2013-08-05") & nasdaq$Date<=as.Date("2018-08-03"),]
警告消息:
1: In `[.data.frame`(nasdaq, nasdaq$Date >= as.Date("2013-08-05") & :
Incompatible methods ("Ops.factor", "Ops.Date") for ">="
2: In `[.data.frame`(nasdaq, nasdaq$Date >= as.Date("2013-08-05") & :
Incompatible methods ("Ops.factor", "Ops.Date") for "<="
我在没有as.Date函数的情况下都尝试了上述两种方法,但是无法正常工作,请告知我哪里可能出问题了?
答案 0 :(得分:1)
警告消息告诉您问题所在。数据框中的Date
列是一个因素,而不是日期。这是因为您没有在stringsAsFactors = FALSE
中指定read.csv
(然后Date
将是一个字符)。
有几种方法可以解决此问题。您可以在读取数据后将其转换为日期:
nasdaq$Date <- as.Date(nasdaq$Date, "%Y-%m-%d")
或者在读取文件时可以使用colClasses
参数:
nasdaq <- read.csv("nasdaq.csv", header = TRUE, colClasses = c("Date", "numeric"))
或者您可以使用readr::read_csv
,它将识别出该列包含日期。
答案 1 :(得分:0)
这应该对您有用,
library(dplyr)
library(lubridate)
# dummmy data
test_data <- data.frame(
Date = ymd(c("2013-08-05","2013-08-06 ","2013-08-07")),
Close.Price = c(3692.95,3665.77,3654.01)
)
test_data %>%
filter(Date >= ymd("2013-08-05") & Date <= ymd("2013-08-07"))
Date Close.Price
1 2013-08-05 3692.95
2 2013-08-06 3665.77
3 2013-08-07 3654.01
答案 2 :(得分:0)
您需要先在as.Date()
函数中指定日期字符串的格式,然后才能在子集函数中使用它
nasdaq$Date <- as.Date(nasdaq$Date, format = "%Y-%m-%d")
chunk <- subset(nasdaq,nasdaq$Date >= "2013-08-05" & nasdaq$Date <= "2018-08-03")