Museful - 2 months ago 43
R Question

# Convert all data frame character columns to factors

Given a (pre-existing) data frame that has columns of various types, what is the simplest way to convert all its character columns to factors, without affecting any columns of other types?

Here's an example

`data.frame`
:

``````df <- data.frame(A = factor(LETTERS[1:5]),
B = 1:5, C = as.logical(c(1, 1, 0, 0, 1)),
D = letters[1:5],
E = paste(LETTERS[1:5], letters[1:5]),
stringsAsFactors = FALSE)
df
#   A B     C D   E
# 1 A 1  TRUE a A a
# 2 B 2  TRUE b B b
# 3 C 3 FALSE c C c
# 4 D 4 FALSE d D d
# 5 E 5  TRUE e E e
str(df)
# 'data.frame':  5 obs. of  5 variables:
#  \$ A: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
#  \$ B: int  1 2 3 4 5
#  \$ C: logi  TRUE TRUE FALSE FALSE TRUE
#  \$ D: chr  "a" "b" "c" "d" ...
#  \$ E: chr  "A a" "B b" "C c" "D d" ...
``````

I know I can do:

``````df\$D <- as.factor(df\$D)
df\$E <- as.factor(df\$E)
``````

Is there a way to automate this process a bit more?

``````DF <- data.frame(x=letters[1:5], y=1:5, stringsAsFactors=FALSE)

str(DF)
#'data.frame':  5 obs. of  2 variables:
# \$ x: chr  "a" "b" "c" "d" ...
# \$ y: int  1 2 3 4 5
``````

The (annoying) default of `as.data.frame` is to turn all character columns into factor columns. You can use that here:

``````DF <- as.data.frame(unclass(DF))
str(DF)
#'data.frame':  5 obs. of  2 variables:
# \$ x: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
# \$ y: int  1 2 3 4 5
``````