【问题标题】:Converting several factor columns with thousand-separator values to integers using tidyverse使用 tidyverse 将具有千位分隔符值的多个因子列转换为整数
【发布时间】:2017-01-18 20:55:03
【问题描述】:

在 SO 上找不到确切的解决方案,无论如何都希望使用 tidyverse 集的 R 包的最简洁的版本。希望除第一列之外的所有列都是整数,并在现实生活场景中满足更多列

df <- structure(list(col_1 = structure(1:3, .Label = c("a", "b", "c"
), class = "factor"), col_2 = structure(c(1L, 3L, 2L), .Label = c("1,234", 
"23", "4,567"), class = "factor"), col_3 = structure(1:3, .Label = c("1234", 
"46", "6,789"), class = "factor")), .Names = c("col_1", "col_2", 
"col_3"), row.names = c(NA, -3L), class = "data.frame")

TIA

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    在列中寻找",",如果存在则将该列设为数字:

    df1 = lapply(df, function(x) {if(any(grepl(",", x))){x<-as.numeric(gsub(",", "", x))};x})
    # as.data.frame(df1)
    #  col_1 col_2 col_3
    #1     a  1234  1234
    #2     b  4567    46
    #3     c    23  6789
    

    【讨论】:

      【解决方案2】:

      可以使用mutate_at,排除第一列,使用gsub去掉逗号,然后转成整数:

      library(tidyverse)
      df %>% mutate_at(.cols = -1, funs(as.integer(gsub(",", "", .))))
      
      #  col_1 col_2 col_3
      #1     a  1234  1234
      #2     b  4567    46
      #3     c    23  6789
      

      parse_number 的另一个选项,虽然这给出了数字列:

      df %>% mutate_at(.cols = -1, funs(parse_number))
      
      #  col_1 col_2 col_3
      #1     a  1234  1234
      #2     b  4567    46
      #3     c    23  6789
      

      【讨论】:

      • 要成为真正的 hadleyversish,您肯定会使用 stringr 而不是 gsub,嗯。现在可能还有一些替代 as.integer 的方法。
      • 刚刚意识到,如果您使用 write_csv(df,"test.csv") 和 df
      【解决方案3】:

      这是带有data.table 的版本。将'data.frame'转换为'data.table'(setDT(df)),在.SDcols中指定感兴趣的列,用lapply循环遍历它们,用gsub中的空格替换,,转换到 integer 并将 (:=) 分配回列

      library(data.table)
      setDT(df)[, (2:3) := lapply(.SD, function(x)
             as.integer(gsub(",", "", x))), .SDcols = 2:3]
      df
      #   col_1 col_2 col_3
      #1:     a  1234  1234
      #2:     b  4567    46
      #3:     c    23  6789
      

      【讨论】:

        猜你喜欢
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-01
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        相关资源
        最近更新 更多