L oop в My Function не меняет мой тип данных (в R) - PullRequest
1 голос
/ 25 марта 2020

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

quicky <- function(df, factors){
      output <- as.character(substitute(factors)[-1])
      print(output)
      df[,output]
      for(i in names(df[,output])){
        hist(df[,as.character(i)])
        df[,as.character(i)] <- as.factor(df[,as.character(i)])#<- Why does this not work?
      }
    }

quicky(mtcars, c(cyl,hp,drat))

Запрос о помощи и объяснения! Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Причина, по которой quickly не может вернуть результаты присваиваний столбцам df, является особенностью R for -l oop. Возвращает NULL. И последняя функция, которая была оценена в вашей quicky функции, была for. Поэтому все, что вам нужно сделать, это добавить вызов к значению df вне l oop:

quicky <- function(df, factors){
    output <- as.character(substitute(factors)[-1])
    print(output)
    df[,output]
    for(i in names(df[,output])){
        hist(df[,as.character(i)])
        df[, i] <- as.factor(df[, i ])
    }; df  # add a call to evaluate `df` 
}

str( quicky(mtcars, c(cyl,hp,drat)) )
#-------
[1] "cyl"  "hp"   "drat"
'data.frame':   32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : Factor w/ 22 levels "52","62","65",..: 11 11 6 11 15 9 20 2 7 13 ...
 $ drat: Factor w/ 22 levels "2.76","2.93",..: 16 16 15 5 6 1 7 11 17 17 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ..

Это поведение for отличается от большинства других функций в R. При for-l oop оценки и назначения, выполненные в нем, обычно вступают в силу вне тела for -l oop, то есть в вызывающей среде, но сам вызов функции возвращает NULL. Большинство других функций не имеют никакого эффекта вне их сред тела функций, что требует от программиста присвоения возвращаемого значения именованному объекту, если требуется какой-либо длительный эффект. (Разумеется, вы не должны ожидать, что это действие повлияет на значение mtcars.)

1 голос
/ 25 марта 2020

Поскольку мы зацикливаемся на именах столбцов, созданных из 'output', просто зацикливаемся на них вместо дальнейшего поднабора данных и получаем te names. Кроме того, в функции return набор данных в конце

quicky <- function(df, factors){
      output <- as.character(substitute(factors)[-1])
      print(output)
     for(i in output){               
          df[[i]] <- as.factor(df[[i]])
           }

           df

    }

out <- quicky(mtcars, c(cyl,hp,drat))
str(out)
#'data.frame':  32 obs. of  11 variables:
# $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
# $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...  ###
# $ disp: num  160 160 108 258 360 ...
# $ hp  : Factor w/ 22 levels "52","62","65",..: 11 11 6 11 15 9 20 2 7 13 ...###
# $ drat: Factor w/ 22 levels "2.76","2.93",..: 16 16 15 5 6 1 7 11 17 17 ...###
# $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
# $ qsec: num  16.5 17 18.6 19.4 17 ...
# $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
# $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
# $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
# $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

ПРИМЕЧАНИЕ. Изменили [ на [[, чтобы он работал с data.table и tbl_df

...