如何在tidyverse中自动有选择地更改变量数据类型?

时间:2019-05-17 15:06:17

标签: r tidyverse

我想将某些变量从数值类型更改为因子类型,而其他类型保持不变。我知道如何一次执行一个变量,但是我想自动处理大型数据集。

我一步一步地更改了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

reprex package(v0.2.1)于2019-05-17创建

我设法成功地更改了变量类型。我不喜欢做类似30至50次的操作。有哪些自动化的方法?谢谢。

4 个答案:

答案 0 :(得分:4)

使用基数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

答案 1 :(得分:4)

library(dplyr)

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

希望这会有所帮助。

答案 2 :(得分:3)

您可以使用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)))

答案 3 :(得分:2)

一个选项是mutate_at。不需要as.factor(as.character,我们可以直接转换为factor。但是,相反的途径是`factor-> character-> numeric)

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