我注意到mutate_at. 假设我有一个数据框和一个要改变的列列表,例如:
df1 <- data_frame(var1 = c(1,2,3,4,5,6),
var2 = c(1,1,1,2,2,2),
var3 = c(10,30,50,70,90,110))
variables <- c("var1", "var2")
Run Code Online (Sandbox Code Playgroud)
我现在申请mutate_at创建variables. 通过在 中指定“cat” list,我确保保留旧版本,并且新版本具有旧版本的名称加上“_cat”:
df1 %>% mutate_at(vars(variables), .funs = list(cat = as.factor))
# A tibble: 6 x 5
var1 var2 var3 var1_cat var2_cat
<dbl> <dbl> <dbl> <fct> <fct>
1 1 1 10 1 1
2 2 1 30 2 1
3 3 1 50 3 1
4 4 2 70 4 2
5 5 2 90 5 2
6 6 2 110 6 2
Run Code Online (Sandbox Code Playgroud)
但是,如果我mutate_at只应用到一列(在我的例子中,我的variables向量只有一个元素),新变量的名称只是“cat”:
variables <- c("var1")
df1 %>% mutate_at(vars(variables), .funs = list(cat = as.factor))
# A tibble: 6 x 4
var1 var2 var3 cat
<dbl> <dbl> <dbl> <fct>
1 1 1 10 1
2 2 1 30 2
3 3 1 50 3
4 4 2 70 4
5 5 2 90 5
6 6 2 110 6
Run Code Online (Sandbox Code Playgroud)
在某种程度上,我理解mutate_at这样做的原因:如果您想以任何特殊方式命名一个变异的列,只需使用mutatelike mutate(var1_cat = as.factor(var1))。
但是,就我而言,我想mutate_at在多个数据帧上运行该操作,对于每个数据帧,我都有一个要更改的列向量。至关重要的是,这些向量可能只有一个元素。那么,mutate_at无论vars收到多少,显示相同的命名行为不是更好吗?
我不认为这是预期的行为(或至少不应该是),好消息是最新版本的dplyr摆脱了这种行为。目前您可以使用 安装它remotes::install_github('tidyverse/dplyr'),但应该在接下来的一两个月内在 CRAN 上安装。
mutate_at(以及其他作用域动词,如mutate_if,summarize_all等)已被across现有动词内的使用所取代,这提供了您正在寻找的行为。
library(dplyr)
variables <- c("var1", "var2")
df1 %>%
mutate(across(all_of(variables), .fns = list(cat = as.factor)))
#> # A tibble: 6 x 5
#> var1 var2 var3 var1_cat var2_cat
#> <dbl> <dbl> <dbl> <fct> <fct>
#> 1 1 1 10 1 1
#> 2 2 1 30 2 1
#> 3 3 1 50 3 1
#> 4 4 2 70 4 2
#> 5 5 2 90 5 2
#> 6 6 2 110 6 2
variables <- c("var1")
df1 %>%
mutate(across(all_of(variables), .fns = list(cat = as.factor)))
#> # A tibble: 6 x 4
#> var1 var2 var3 var1_cat
#> <dbl> <dbl> <dbl> <fct>
#> 1 1 1 10 1
#> 2 2 1 30 2
#> 3 3 1 50 3
#> 4 4 2 70 4
#> 5 5 2 90 5
#> 6 6 2 110 6
Run Code Online (Sandbox Code Playgroud)
会话信息
sessionInfo()
#> R version 3.6.3 (2020-02-29)
#> Platform: x86_64-w64-mingw32/x64 (64-bit)
#> Running under: Windows 10 x64 (build 17763)
#>
#> Matrix products: default
#>
#> locale:
#> [1] LC_COLLATE=English_United Kingdom.1252
#> [2] LC_CTYPE=English_United Kingdom.1252
#> [3] LC_MONETARY=English_United Kingdom.1252
#> [4] LC_NUMERIC=C
#> [5] LC_TIME=English_United Kingdom.1252
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] dplyr_0.8.99.9001
#>
#> loaded via a namespace (and not attached):
#> [1] Rcpp_1.0.3 knitr_1.28 magrittr_1.5 tidyselect_1.0.0
#> [5] R6_2.4.1 rlang_0.4.5.9000 fansi_0.4.1 stringr_1.4.0
#> [9] highr_0.8 tools_3.6.3 xfun_0.12 utf8_1.1.4
#> [13] cli_2.0.2 htmltools_0.4.0 ellipsis_0.3.0 assertthat_0.2.1
#> [17] yaml_2.2.1 digest_0.6.25 tibble_2.1.3 lifecycle_0.2.0
#> [21] crayon_1.3.4 purrr_0.3.3 vctrs_0.2.99.9010 glue_1.3.2
#> [25] evaluate_0.14 rmarkdown_2.1 stringi_1.4.6 compiler_3.6.3
#> [29] pillar_1.4.3 pkgconfig_2.0.3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |