提问人:Rasoul 提问时间:2/13/2012 最后编辑:zx8754Rasoul 更新时间:1/15/2022 访问量:499387
将 data.frame 列格式从字符转换为因子
Convert data.frame column format from character to factor
问:
我想将我的 data.frame 对象 () 的某些列的格式(类)从字符更改为因子。mydf
当我按功能读取文本文件时,我不想这样做。read.table()
任何帮助将不胜感激。
答:
嗨,欢迎来到 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
评论
mydf$col_names[i]
mydf[,col_names[i]]
mydf[, col_names]
# 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)
评论
length(col_names)==1
df[,col_names]
lapply
df[,col_names,drop=FALSE]
df[col_names]
如果要在加载数据后将 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
)
评论
stringsAsFactors = TRUE
read_excel()
readxl
您可以使用的另一种简短方法是 magrittr 包中的管道 ()。它将字符列 mycolumn 转换为因子。%<>%
library(magrittr)
mydf$mycolumn %<>% factor
评论
我用一个函数来做。在本例中,我只将字符变量转换为因式分解:
for (i in 1:ncol(data)){
if(is.character(data[,i])){
data[,i]=factor(data[,i])
}
}
评论
[[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)
评论
mutate_at
当你有很多列(~50000)并且你只需要转换 3 时,它真的很快。
除非您需要自动识别列,否则我发现这是最简单的解决方案:
df$name <- as.factor(df$name)
这使得 DataFrame 中的列成为一个因素。name
df
您可以使用新的 1.0.0across
dplyr
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))
评论
unclass
data.frame