将data.frame列格式从字符转换为因子

时间:2012-02-12 18:17:07

标签: r dataframe character r-faq

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

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

任何帮助都将不胜感激。

8 个答案:

答案 0 :(得分:170)

欢迎来到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

答案 1 :(得分:75)

# To do it for all names
df[] <- lapply( df, factor) # the "[]" keeps the dataframe structure
 col_names <- names(df)
# do do it for some names in a vector named 'col_names'
df[col_names] <- lapply(df[col_names] , factor)

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

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

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

答案 2 :(得分:14)

如果要在已经加载数据之后将data.frame中的所有字符变量更改为因子,可以像这样将其更改为名为{{1的data.frame }}:

dat

这会创建一个向量,用于标识哪些列属于类character_vars <- lapply(dat, class) == "character" dat[, character_vars] <- lapply(dat[, character_vars], as.factor) ,然后将character应用于这些列。

示例数据:

as.factor

答案 3 :(得分:14)

您可以使用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 :(得分:9)

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

library(magrittr)

mydf$mycolumn %<>% factor

答案 5 :(得分:2)

我正在使用一个函数。在这种情况下,我只会将字符变量转换为factor:

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

答案 6 :(得分:2)

您可以将 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))

答案 7 :(得分:0)

我们也可以使用 modify_if 中的 purrr 函数。它将采用谓词函数 .p 并将其应用于我们数据集的每个元素,并应用函数 .f,其中谓词导致单个 TRUE

  • 我使用了 modify_if,因为它保留输入类型并返回相同类型的输出
  • 另一个变体是map_if
starwars %>% modify_if(~ is.character(.x), ~ factor(.x))

# A tibble: 87 x 14
   name   height  mass hair_color skin_color eye_color birth_year sex   gender homeworld species
   <fct>   <int> <dbl> <fct>      <fct>      <fct>          <dbl> <fct> <fct>  <fct>     <fct>  
 1 Luke ~    172    77 blond      fair       blue            19   male  mascu~ Tatooine  Human  
 2 C-3PO     167    75 NA         gold       yellow         112   none  mascu~ Tatooine  Droid  
 3 R2-D2      96    32 NA         white, bl~ red             33   none  mascu~ Naboo     Droid  
 4 Darth~    202   136 none       white      yellow          41.9 male  mascu~ Tatooine  Human  
 5 Leia ~    150    49 brown      light      brown           19   fema~ femin~ Alderaan  Human  
 6 Owen ~    178   120 brown, gr~ light      blue            52   male  mascu~ Tatooine  Human  
 7 Beru ~    165    75 brown      light      blue            47   fema~ femin~ Tatooine  Human  
 8 R5-D4      97    32 NA         white, red red             NA   none  mascu~ Tatooine  Droid  
 9 Biggs~    183    84 black      light      brown           24   male  mascu~ Tatooine  Human  
10 Obi-W~    182    77 auburn, w~ fair       blue-gray       57   male  mascu~ Stewjon   Human  
# ... with 77 more rows, and 3 more variables: films <list>, vehicles <list>, starships <list>