Как выборочно изменить тип данных переменной автоматически в Tidyverse? - PullRequest
1 голос
/ 17 мая 2019

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

Я изменил переменные в наборе данных mtcars одну за другой, копируя и вставляя код. Я использовал mapply, чтобы успешно автоматизировать это, но мне удалось сделать это только на подмножестве mtcars. Однако я не уверен, как бы сохранить целостность всего набора данных с новыми типами переменных. Представляем ниже.


#before

as_tibble(mtcars)
#> # A tibble: 32 x 11
#>      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
#>  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
#>  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
#>  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
#>  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
#>  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
#>  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
#>  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
#>  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
#> 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
#> # ... with 22 more rows

#copy + paste job

mtcars$cyl <- factor(as.character(mtcars$cyl))
mtcars$hp <- factor(as.character(mtcars$hp))
mtcars$vs <- factor(as.character(mtcars$vs))

#after

as_tibble(mtcars)
#> # A tibble: 32 x 11
#>      mpg cyl    disp hp     drat    wt  qsec vs       am  gear  carb
#>    <dbl> <fct> <dbl> <fct> <dbl> <dbl> <dbl> <fct> <dbl> <dbl> <dbl>
#>  1  21   6      160  110    3.9   2.62  16.5 0         1     4     4
#>  2  21   6      160  110    3.9   2.88  17.0 0         1     4     4
#>  3  22.8 4      108  93     3.85  2.32  18.6 1         1     4     1
#>  4  21.4 6      258  110    3.08  3.22  19.4 1         0     3     1
#>  5  18.7 8      360  175    3.15  3.44  17.0 0         0     3     2
#>  6  18.1 6      225  105    2.76  3.46  20.2 1         0     3     1
#>  7  14.3 8      360  245    3.21  3.57  15.8 0         0     3     4
#>  8  24.4 4      147. 62     3.69  3.19  20   1         0     4     2
#>  9  22.8 4      141. 95     3.92  3.15  22.9 1         0     4     2
#> 10  19.2 6      168. 123    3.92  3.44  18.3 1         0     4     4
#> # ... with 22 more rows

Создано в 2019-05-17 с помощью представительного пакета (v0.2.1)

Мне удалось успешно изменить типы переменных. Я бы не хотел делать это примерно 30-50 раз. Какие есть способы автоматизировать это? Спасибо.

Ответы [ 4 ]

4 голосов
/ 17 мая 2019
library(dplyr)

as_tibble(mtcars) %>%
  mutate_at(.vars = vars(cyl, hp, vs),
            .funs = ~ factor(as.character(.)))

Надеюсь, это поможет.

4 голосов
/ 17 мая 2019

Использование базы R:

vars_to_make_f <- c("cyl", "hp", "vs")
mtcars[vars_to_make_f] <- 
  lapply(mtcars[vars_to_make_f], function(x) as.factor(as.character(x)))

mtcars
# A tibble: 32 x 11
     mpg cyl    disp hp     drat    wt  qsec vs       am  gear  carb
   <dbl> <fct> <dbl> <fct> <dbl> <dbl> <dbl> <fct> <dbl> <dbl> <dbl>
 1  21   6      160  110    3.9   2.62  16.5 0         1     4     4
 2  21   6      160  110    3.9   2.88  17.0 0         1     4     4
 3  22.8 4      108  93     3.85  2.32  18.6 1         1     4     1
 4  21.4 6      258  110    3.08  3.22  19.4 1         0     3     1
 5  18.7 8      360  175    3.15  3.44  17.0 0         0     3     2
 6  18.1 6      225  105    2.76  3.46  20.2 1         0     3     1
 7  14.3 8      360  245    3.21  3.57  15.8 0         0     3     4
 8  24.4 4      147. 62     3.69  3.19  20   1         0     4     2
 9  22.8 4      141. 95     3.92  3.15  22.9 1         0     4     2
10  19.2 6      168. 123    3.92  3.44  18.3 1         0     4     4
# ... with 22 more rows
3 голосов
/ 17 мая 2019

Вы можете использовать mutate_at:

 mtcars %>% 
 mutate_at(c("cyl","hp","vs"),function(x) factor(as.character(x)))

Или используйте purrr modify_at:

mtcars %>% 
  modify_at(c("cyl","hp","vs"),function(x) factor(as.character(x)))
2 голосов
/ 17 мая 2019

Опция mutate_at.as.factor(as.character не требуется, мы можем напрямую преобразовать в factor.Но обратный маршрут будет `фактор -> символ -> числовой)

library(dplyr)
mtcars %>%
     as_tibble %>%
     mutate_at(vars(cyl, hp, vs), factor)
# A tibble: 32 x 11
#     mpg cyl    disp hp     drat    wt  qsec vs       am  gear  carb
#   <dbl> <fct> <dbl> <fct> <dbl> <dbl> <dbl> <fct> <dbl> <dbl> <dbl>
# 1  21   6      160  110    3.9   2.62  16.5 0         1     4     4
# 2  21   6      160  110    3.9   2.88  17.0 0         1     4     4
# 3  22.8 4      108  93     3.85  2.32  18.6 1         1     4     1
# 4  21.4 6      258  110    3.08  3.22  19.4 1         0     3     1
# 5  18.7 8      360  175    3.15  3.44  17.0 0         0     3     2
# 6  18.1 6      225  105    2.76  3.46  20.2 1         0     3     1
# 7  14.3 8      360  245    3.21  3.57  15.8 0         0     3     4
# 8  24.4 4      147. 62     3.69  3.19  20   1         0     4     2
# 9  22.8 4      141. 95     3.92  3.15  22.9 1         0     4     2
#10  19.2 6      168. 123    3.92  3.44  18.3 1         0     4     4
# … with 22 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...