2016-12-15 17 views

ответ

1

На данный момент RevoScaleR не поддерживает изменение типа переменной в файле XDF (даже если вы пишете в другой файл). Способ сделать это - создать новую переменную, удалить старый, а затем переименовать новую переменную в старое имя.

Я предложил бы делать это с transformFunc (см ?rxTransform для получения дополнительной информации), так что вы можете создать новую переменную и падение старого, все в одном шаге:

rxDataStep(inXdf, outXdf, transformFunc=function(varlst) { 
    varlst$Var1b <- as.numeric(varlst$Var1) 
    varlst$Var1 <- NULL 
    varlst 
}, transformVars="Var1") 

# this is fast as it only modifies the xdf metadata, not the data itself 
names(outXdf)[names(outXdf) == "Var1b"] <- "Var1" 
+0

В чем причина того, что RevoScaleR не позволяет манипулировать существующей переменной на месте? – JimBoy

+0

Я не в команде разработчиков, поэтому я не могу дать окончательный ответ, но это было бы по соображениям производительности. –

1

MSR не позволяет перезаписать переменную в месте с другим типом переменной.

У вас есть два варианта: записать в другую переменную или записать в другой файл. Я добавил немного кода, который показывает, что оба решения работают, как указано в MRS 9.0.1. Как указано в комментариях, в ранних версиях есть некоторые моменты, когда это может не сработать. Я не совсем уверен, где эта точка, поэтому код должен сообщить вам об этом.

input_xdf <- "test.xdf" 
modified_xdf <- "test_out.xdf" 

xdf_data <- data.frame(Var1 = as.character(1:10), 
         Var2 = 2:11, 
         stringsAsFactors = FALSE) 

rxDataStep(inData = xdf_data, 
      outFile = input_xdf, 
      rowsPerRead = 5, 
      overwrite = TRUE) 

rxDataStep(inData = input_xdf, 
      outFile = input_xdf, 
      overwrite = TRUE, 
      transforms = list(Var1b = as.numeric(Var1)), 
      transformVars = c("Var1") 
) 

rxGetInfo(input_xdf, getVarInfo = TRUE, numRows = 5) 

rxDataStep(inData = input_xdf, 
      outFile = modified_xdf, 
      transforms = list(Var1 = as.numeric(Var1)), 
      transformVars = c("Var1") 
) 

rxGetInfo(modified_xdf, getVarInfo = TRUE, numRows = 5) 
+1

На самом деле, ваш второй вариант выиграл (одна из тех раздражающих бородавок в RevoScaleR). Я не думаю, что есть способ изменить тип существующей переменной, даже если вы пишете в другой файл. –

+0

@HongOoi, Возможно, это было правдой раньше, но сейчас это не так. Я тестировал, прежде чем отправил. Оба решения работают. Я добавлю код, чтобы сделать его рабочим. –

+0

Я получаю смешанные результаты. Письмо отправлено. –

 Смежные вопросы

  • Нет связанных вопросов^_^