Удаление даты записи в sparkR

У меня есть DataFrame x. Он содержит идентификатор и дату. Так

head(x)

дает ID = 1 2... и Date = "2012-05-05" "2015-01-01"...

Я хочу создать новый набор данных, в котором будут удалены все идентификаторы с датой выше «2013-01-01» + P. P - день, например, P = 3 дня.

В sparkR я делаю это

newdata <- filter(x, x$Date < as.Date(2013-01-01 + P) )

но sparkR этого не принимает.


person Ole Petersen    schedule 03.08.2015    source источник


Ответы (2)


Когда вы говорите, что «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)
    

Мораль этой истории: опубликуйте все ошибки, полученные при задании вопросов, попробуйте работать с вашим кодом по частям (если вся строка кода не работает, попробуйте разбить ее на мельчайшие части, которые работают, чтобы вы могли решить свои проблемы один за раз).

person mathematical.coffee    schedule 03.08.2015
comment
Спасибо за ответ. В sparkR я должен написать x$Date вместо Date в команде «подмножество», иначе «Дата» не может быть найдена. Когда я использую команду подмножества, sparkR говорит мне, что «подмножество должно быть логическим». Когда я использую команду «фильтр», она работает нормально. Для меня я не знал, что as.Date(2013-01-01) + 3 добавляло 3 к дате, например, в виде дней, а не лет. - person Ole Petersen; 03.08.2015
comment
Ура, я не понял, что sparkR перезаписал filter. (Вот почему полезно публиковать сообщения об ошибках, которые вы получаете с вашим вопросом...) - person mathematical.coffee; 03.08.2015

Как предложил @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)
person Wannes Rosiers    schedule 03.08.2015