我想将data.frame对象(mydf
)的某些列的格式(类)从 charactor 更改为 factor 。
当我通过read.table()
函数阅读文本文件时,我不想这样做。
任何帮助都将不胜感激。
答案 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>