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

我想将 data.frame 对象(mydf)的一些列的格式(类)从 性格改为 因素

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

如果你能帮忙,我将不胜感激。

465262 次浏览

嗨,欢迎来到 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 的新手,我建议你看看这两个网站:

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

参考卡: < a href = “ http://cran.r-project.org/doc/Contrib/Short-refcard.pdf”> http://cran.r-project.org/doc/contrib/short-refcard.pdf

# 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.[<-应该成功地将它们粘贴回数据帧 df

另一种策略是只转换那些唯一项数量少于某个条件的列,比如说少于行数的日志:

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

如果你想把 data.frame 中的 所有字符变量改为 factor,你可以这样做,改为 data.frame 中的 dat:

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
)

您可以使用的另一种简单方法是来自 Magrittr包的管道(%<>%)。它将字符列 我的专栏转换为一个因子。

library(magrittr)


mydf$mycolumn %<>% factor

我已经用一个函数做到了,在这种情况下,我将只把字符变量转换为 factor:

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

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

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

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

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

您可以将 across与新的 dplyr1.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))