Museful - 1 year ago 203
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
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download