代码之家  ›  专栏  ›  技术社区  ›  Seymour

在data.frame中有条件地将列从char变为factor

  •  0
  • Seymour  · 技术社区  · 6 年前

    我想用 ROracle 在中查询Oracle数据库 R .

    我已经可以把一张桌子放在 data.frame ,尽管我面临以下问题。

    假设如下 数据帧 ,

    my_table <- data.frame(name = c("a","b"), surname = c("h", "i"), stuff = c("as", "qweq"))
    

    我的目标是找到一个完全自动化的代码行 factor 所有列 characters 哪一个名字 包含字符串 "name" .

    在这种情况下,只有 stuff 应转换为因子。

    2 回复  |  直到 6 年前
        1
  •  1
  •   camille    6 年前

    一个 dplyr 解决方案: mutate_at 接受选择帮助器函数,如 tidyselect::contains ,它在列名中搜索字符串并仅对其进行操作。还有 tidyselect::matches ,类似但需要正则表达式。在这种情况下,因为您希望列 不要 有了这个字符串,我就否定了那些列的位置。

    还要注意的是 data.frame 就是把字符向量变成因子,所以这些都已经是因子了。

    library(tidyverse)
    
    my_table <- data.frame(name = c("a","b"), surname = c("h", "i"), stuff = c("as", "qweq"), 
                           stringsAsFactors = F)
    
    my_table %>%
      mutate_at(vars(-contains("name")), as.factor) %>%
      as_tibble()
    #> # A tibble: 2 x 3
    #>   name  surname stuff
    #>   <chr> <chr>   <fct>
    #> 1 a     h       as   
    #> 2 b     i       qweq
    

    你可以省略 as_tibble ;我这样做只是为了得到包含列类型的打印输出。

        2
  •  0
  •   Ian Wesley    6 年前

    有多种方法可以做到这一点,下面是base R中的一个快速示例:

    my_table <- data.frame(name = c("a","b"), surname = c("h", "i"), stuff = c("as", "qweq"), stringsAsFactors = FALSE)
    
    my_table[, -(grep("name", colnames(my_table)))] <- as.factor(my_table[, -(grep("name", colnames(my_table)))])