Написание функции, которая конвертирует переменные режимы и классы - PullRequest
1 голос
/ 17 апреля 2019

Я использую следующий код ( LINK ) для очистки потенциально проблемных аспектов данных для гипотетического df, называемого dataframe:

dataframe <- fread(
    "A   B  B.x  C  D   E   iso   year   
     0   3   NA  1  NA  NA  NLD   2009   
     1   4   NA  2  NA  NA  NLD   2009   
     0   5   NA  3  NA  NA  AUS   2011   
     1   5   NA  4  NA  NA  AUS   2011   
     0   0   NA  7  NA  NA  NLD   2008   
     1   1   NA  1  NA  NA  NLD   2008   
     0   1   NA  3  NA  NA  AUS   2012   
     0   NA  1   NA  1  NA  ECU   2009   
     1   NA  0   NA  2  0   ECU   2009   
     0   NA  0   NA  3  0   BRA   2011   
     1   NA  0   NA  4  0   BRA   2011   
     0   NA  1   NA  7  NA  ECU   2008   
     1   NA  0   NA  1  0   ECU   2008   
     0   NA  0   NA  3  2   BRA   2012   
     1   NA  0   NA  4  NA  BRA   2012",
   header = TRUE
)

dataframe <- as.data.frame(dataframe)
## get mode of all vars
var_mode <- sapply(dataframe, mode)
## produce error if complex or raw is found
if (any(var_mode %in% c("complex", "raw"))) stop("complex or raw not allowed!")
## get class of all vars
var_class <- sapply(dataframe, class)
## produce error if an "AsIs" object has "logical" or "character" mode
if (any(var_mode[var_class == "AsIs"] %in% c("logical", "character"))) {
  stop("matrix variables with 'AsIs' class must be 'numeric'")
  }
## identify columns that needs be coerced to factors
ind1 <- which(var_mode %in% c("logical", "character"))
## coerce logical / character to factor with `as.factor`
dataframe[ind1] <- lapply(dataframe[ind1], as.factor)

Поскольку я часто его использую, я бы предпочел поместить его в функцию и попробовал следующее:

cleanfunction <- function(dataframe) {
dataframe <- as.data.frame(dataframe)
## get mode of all vars
var_mode <- sapply(dataframe, mode)
## produce error if complex or raw is found
if (any(var_mode %in% c("complex", "raw"))) stop("complex or raw not allowed!")
## get class of all vars
var_class <- sapply(dataframe, class)
## produce error if an "AsIs" object has "logical" or "character" mode
if (any(var_mode[var_class == "AsIs"] %in% c("logical", "character"))) {
  stop("matrix variables with 'AsIs' class must be 'numeric'")
  }
## identify columns that needs be coerced to factors
ind1 <- which(var_mode %in% c("logical", "character"))
## coerce logical / character to factor with `as.factor`
dataframe[ind1] <- lapply(dataframe[ind1], as.factor)
}

dfclean <- cleanfunction(dataframe)

Тем не менее, был создан список переменных, преобразованных в факторы вместо фрейма данных, в котором эти переменные преобразованы в факторы.

Как я могу решить это?

1 Ответ

2 голосов
/ 17 апреля 2019

Функции возвращают значение из последнего вычисленного выражения. В этом случае последнее выражение, вычисленное как

dataframe[ind1] <- lapply(dataframe[ind1], as.factor)

и операция <- всегда просто возвращает правое значение. Таким образом, вы просто возвращаете результаты из lapply, а не из обновленного dataframe.

Вам просто нужно добавить еще одну строку, которая говорит

return(dataframe)

или просто

dataframe

до конца вашей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...