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


153

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

当我按read.table()功能读取文本文件时,我不想这样做。

任何帮助,将不胜感激。


12
mydf $ myfavoritecolumn <-as.factor(mydf $ myfavoritecolumn)
tim riffe 2012年

谢谢!但是我还有另一个问题。我有字符col_names []数组中每一列的名称。我如何使用上述命令(mydf $ col_names [i])不起作用。
拉苏尔

任何针对所有字符变量自动执行此操作的方法,因为data.frame是否使用stringsAsFactors?
EtienneLow-Décarie2012年

@EtienneLow-Décarie:公正地unclass使用data.frame结果。
IRTFM

Answers:


197

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

1
@Rasoul,mydf[, col_names]将这样做
DrDom

3
+1代表裁判。这是基本的东西,可以问一下,但是也可以知道这些(和类似的)作品中已进行了大量的工作。
罗曼·卢斯特里克(RomanLuštrik)

84
# 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)

这是一个非常好的解决方案!它也可以与列号一起使用,如果您想更改很多但不是全部,则这可能特别有用。例如,col_nums <-c(1,6,7:9,21:23,27:28,30:31,39,49:55,57)然后df [,col_nums] <-lapply(df [,col_nums] ,因子)。
WGray 2014年

注意:如果,第一个解决方案不起作用length(col_names)==1。在这种情况下,df[,col_names]会自动降级为向量,而不是长度为1的列表,然后lapply尝试对每个条目(而不是整个列)进行操作。这可以通过使用来防止df[,col_names,drop=FALSE]
P Schnell

这是一个好点。可以保留列表状态的另一个调用是use df[col_names]
IRTFM

27

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

18

如果要在已加载数据后将data.frame中的所有字符变量更改为因数,则可以像这样将其更改为data dat: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
                  )

每个字符变量到因数的完整转换通常在读取数据时发生,例如with stringsAsFactors = TRUE,但这在说您已经read_excel()readxl包中读取数据并想要训练一个不接受的随机森林模型时很有用。字符变量。
Sam Firke '16

13

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

library(magrittr)

mydf$mycolumn %<>% factor

请编辑更多信息。不建议使用纯代码和“尝试此”答案,因为它们不包含可搜索的内容,并且不解释为什么有人应该“尝试此”。我们在这里努力成为知识的资源。
Brian Tompsett-汤莱恩

请问是否要在df的所有列中使用它?
Mostafa

5

我正在用一个功能。在这种情况下,我仅将字符变量转换为因数:

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

我相信您需要双括号才能实际提取列并将其更改为一个因子,例如[[i]]
RTrain3k
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.