我有一个 DataFrame x。它包含 ID 和日期。所以
head(x)
给出 ID = 1 2 ... 和 Date = "2012-05-05" "2015-01-01" ...
我想创建一个新的数据集,其中删除所有日期高于“2013-01-01”+ P 的 ID。P 是天,例如 P = 3 天。
在 sparkR 我这样做
newdata <- filter(x, x$Date < as.Date(2013-01-01 + P) )
但 sparkR 不接受这一点。
当你说“sparkR 不接受这个”时,你应该详细说明。有错误吗?错误是什么?或者代码是否运行没有错误,但没有给出预期的结果?在这种情况下,它给出了什么?
您有许多相当琐碎的语法错误。
subset,不是filter。提示:?filter向您展示此函数“将线性过滤应用于单变量时间序列”,其中“过滤”并不意味着“子集”意义上的过滤,而是“卷积”意义上的过滤当你时as.Date,你的日期应该用引号括起来。添加P到日期,而不是在日期构造函数中。作为提示:
as.Date(2013-01-01)
Error in as.Date.numeric(2013 - 1 - 1) : 'origin' must be supplied
请注意,这是试图转换 '2013 - 1 - 1',即数字2011。它表示as.Date.numeric您要提供字符串“2013-01-01”。当您尝试此操作时,它会起作用:
as.Date("2013-01-01")
# [1] "2013-01-01"
然后添加您的 3 和subset. 顺便说一句,subset您不需要x$在前面提供Date(请参阅?subset):
subset(x, Date < as.Date("2013-01-01") + 3)
故事的寓意:发布提问时收到的所有错误,尝试一点一点地处理您的代码(如果整行代码不起作用,请尝试将其分解成最小的有效部分,以便您解决问题一次一个)。
正如@mathematical.coffee 所建议的,您应该将 P 放在 as.Date 之外,但与他所说的相反,在 SparkR 中您应该使用过滤器,因此以下是工作代码:
# Create x and set it to a data
x2 <- data.frame(ID=c(1,2),
Date=c("2012-05-05","2015-01-01"))
x2$Date <- as.Date(x2$Date)
x <- createDataFrame(sqlContext,x2)
# set P and compare the dates
P <- 2
newdata <- filter(x, x$Date < (as.Date("2013-01-01")+P) )
# See the first results (in my example only one row)
head(newdata)