【问题标题】:dplyr: mutate_at to convert character columns to factor columnsdplyr: mutate_at 将字符列转换为因子列
【发布时间】:2018-07-31 06:16:25
【问题描述】:

我正在尝试将字符列转换为 data.table 数据表对象中的因子列。我可以这样做:

df$a <- as.factor(df$a)

虽然这似乎可行,但它也会报错:

Warning messages:
1: Unknown or uninitialised column: 'a'. 

上述问题似乎并不少见。它在Fixing a multiple warning "unknown column" 进行了探索但仍未解决。看来更改列类型的基于dplyr 的解决方案是最好的。所以这就是我想要做的。让我们看一个玩具示例。

假设我有一个data.table df

names(df)
[1] "a"  "b"  "c"                   
[4] "d"  "e"  "f"     

我试试:

df %>% mutate_at(.vars = vars(a), 
                 .funs = funs(factor))

但我明白了:

Error in overscope_eval_next(overscope, expr) : object 'a' not found

为什么找不到对象“a”,我该如何解决?

另一个mutate_at解决方案的参考:dplyr change many data types

仅供参考,这里是我的sessionInfo()

sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] bindrcpp_0.2        dplyr_0.7.4         bit64_0.9-7         bit_1.1-12          data.table_1.10.4-3
[6] h2o_3.16.0.2       

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.15     utf8_1.1.3       crayon_1.3.4     assertthat_0.2.0 bitops_1.0-6     R6_2.2.2        
 [7] jsonlite_1.5     magrittr_1.5     pillar_1.1.0     cli_1.0.0        rlang_0.1.6      tools_3.4.3     
[13] glue_1.2.0       RCurl_1.95-4.10  compiler_3.4.3   pkgconfig_2.0.1  bindr_0.1        tibble_1.4.2    

【问题讨论】:

  • 它甚至适用于data.table
  • 请分享str(df)的输出。
  • 我支持@MKR 的声明,这对我有用:df &lt;- data.table(a = rep(0,10),b = rep(0,10),c = rep(0,10),d = rep(0,10),e = rep(0,10)) df %&gt;% mutate_at(.vars(a), .funs = funs(factor)) 我有 R 版本 3.4.3。并加载data.table_1.10.4-3 dplyr_0.7.4
  • 快速更新:@Sastibe 的上述示例也适用于我。一定是我的df 的问题。让我花点时间尝试找出问题所在,然后我会报告。

标签: r dplyr


【解决方案1】:

由于 dplyr 1.0.0 已弃用 mutate_at 之类的作用域变体,这里更新了如何使用 across 执行此操作:

df %>% mutate(across(a, as_factor))

重要: 应用的函数必须在 across() 调用之内,而不是之外。

【讨论】:

    【解决方案2】:

    dplyr 提供双重赋值运算符 %&lt;&gt;% 从左到右管道,然后将管道的末端重新分配回运算符左侧的参数。

    简而言之,这应该有效: df$a %<>% as.factor

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 2020-10-12
      • 2014-01-05
      • 2018-07-18
      • 1970-01-01
      相关资源
      最近更新 更多