【问题标题】:Convert data.frame column format from character to factor将 data.frame 列格式从字符转换为因子
【发布时间】:2012-03-04 07:29:30
【问题描述】:

我想将我的 data.frame 对象 (mydf) 的某些列的格式(类)从 charactor 更改为 factor

当我通过read.table() 函数读取文本文件时,我不想这样做。

任何帮助将不胜感激。

【问题讨论】:

  • mydf$myfavoritecolumn
  • 谢谢!但我还有另一个问题。我在字符数组 col_names[] 中有每列的名称。如何使用上面的命令(mydf$col_names[i])不起作用。
  • 有什么方法可以自动为所有字符变量执行此操作,就像 data.frame 使用 stringsAsFactors 一样?
  • @EtienneLow-Décarie:只需 unclass 并在结果上使用 data.frame

标签: r dataframe character r-faq


【解决方案1】:

您好,欢迎来到 R 的世界。

mtcars  #look at this built in data set
str(mtcars) #allows you to see the classes of the variables (all numeric)

#one approach it to index with the $ sign and the as.factor function
mtcars$am <- as.factor(mtcars$am)
#another approach
mtcars[, 'cyl'] <- as.factor(mtcars[, 'cyl'])
str(mtcars)  # now look at the classes

这也适用于字符、日期、整数和其他类

由于您是 R 新手,我建议您看看这两个网站:

R 参考手册: http://cran.r-project.org/manuals.html

R 参考卡: http://cran.r-project.org/doc/contrib/Short-refcard.pdf

【讨论】:

  • 谢谢!但我还有另一个问题。我在字符数组 col_names[] 中有每列的名称。如何使用上述命令(mydf$col_names[i]mydf[,col_names[i]] 都不起作用。)
  • @Rasoul, mydf[, col_names] 会这样做
  • 参考 +1。这是基本的东西,可以问,但了解这些(和类似的)作品中投入的大量工作也很好。
【解决方案2】:
# To do it for all names
df[] <- lapply( df, factor) # the "[]" keeps the dataframe structure

# to do it for some names in a vector named 'col_names'
col_names <- names(df)
df[col_names] <- lapply(df[col_names] , factor)

解释。所有数据帧都是列表,[ 与多个值参数一起使用的结果同样是列表,因此循环列表是lapply 的任务。上面的分配将创建一组列表,函数data.frame.[&lt;- 应该成功地插入到数据帧中,df

另一种策略是仅转换唯一项目数小于某个标准的列,例如,比行数的日志少:

cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)

【讨论】:

  • 这是一个非常好的解决方案!它还可以与列号一起使用,如果您想更改很多但不是全部,这可能特别有用。例如,col_nums
  • 警告:如果length(col_names)==1,第一个解决方案不起作用。在这种情况下,df[,col_names] 会自动降级为向量而不是长度为 1 的列表,然后lapply 会尝试对每个条目而不是整个列进行操作。这可以通过使用df[,col_names,drop=FALSE] 来防止。
  • 这是一个很好的观点。另一个保留列表状态的调用是使用df[col_names]
【解决方案3】:

您可以使用dplyr::mutate_if() 将所有字符列或dplyr::mutate_at() 用于选择命名字符列转换为因子:

library(dplyr)

# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)

# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)

【讨论】:

    【解决方案4】:

    如果您想在加载数据后将 data.frame 中的 all 字符变量更改为因子,您可以这样做,更改为名为 dat 的 data.frame :

    character_vars <- lapply(dat, class) == "character"
    dat[, character_vars] <- lapply(dat[, character_vars], as.factor)
    

    这会创建一个向量来识别哪些列属于character 类,然后将as.factor 应用于这些列。

    样本数据:

    dat <- data.frame(var1 = c("a", "b"),
                      var2 = c("hi", "low"),
                      var3 = c(0, 0.1),
                      stringsAsFactors = FALSE
                      )
    

    【讨论】:

    • 每个字符变量到因子的完全转换通常发生在读取数据时,例如,使用stringsAsFactors = TRUE,但是当您使用read_excel()readxl 包,想训练一个不接受字符变量的随机森林模型。
    【解决方案5】:

    您可以使用的另一种简短方法是 magrittr 包中的管道 (%&lt;&gt;%)。它将字符列 mycolumn 转换为一个因子。

    library(magrittr)
    
    mydf$mycolumn %<>% factor
    

    【讨论】:

    • 请编辑更多信息。不鼓励使用纯代码和“试试这个”的答案,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。我们在这里努力成为知识的资源。
    • 如果我想将它用于我的 df 的所有列?
    【解决方案6】:

    我用一个函数来做。在这种情况下,我只会将字符变量转换为因子:

    for (i in 1:ncol(data)){
        if(is.character(data[,i])){
            data[,i]=factor(data[,i])
        }
    }
    

    【讨论】:

    • 我相信你需要双括号来实际提取列并将其更改为一个因子,例如[[i]]
    【解决方案7】:

    除非您需要自动识别列,否则我发现这是最简单的解决方案:

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

    这使得数据框df 中的列name 成为一个因素。

    【讨论】:

      【解决方案8】:

      您可以将across 与新的dplyr 1.0.0 一起使用

      library(dplyr)
      
      df <- mtcars 
      #To turn 1 column to factor
      df <- df %>% mutate(cyl = factor(cyl))
      
      #Turn columns to factor based on their type. 
      df <- df %>% mutate(across(where(is.character), factor))
      
      #Based on the position
      df <- df %>% mutate(across(c(2, 4), factor))
      
      #Change specific columns by their name
      df <- df %>% mutate(across(c(cyl, am), factor))
      

      【讨论】:

        猜你喜欢
        • 2011-02-20
        • 1970-01-01
        • 2015-02-16
        • 2018-05-17
        • 2018-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多