0

let's say I have the following dataframe

a <- as.integer(runif(20, 1, 30))
b <- as.integer(runif(20, 10, 30))
df <- data.frame(Sender = a, Receiver = b)
df

I want to transform both columns into factor:

var <- c("Sender", "Receiver")
df[var] <- lapply(var, factor)
str(df)

But it turns out that there is just one level in each column instead of as many as unique numbers in my example

'data.frame':   20 obs. of  2 variables:
 $ Sender  : Factor w/ 1 level "Sender": 1 1 1 1 1 1 1 1 1 1 ...
 $ Receiver: Factor w/ 1 level "Receiver": 1 1 1 1 1 1 1 1 1 1 ...

Of course if works if I do it separately:

df$Sender <- as.factor(df$Sender)
df$Receiver <- as.factor(df$Receiver)

Can someone explain why?

2 Answers2

3

You're not actually using your original data here, only the label.

Try it like this:

df <- as.data.frame(lapply(df, factor))
mpjdem
  • 1,504
  • 9
  • 14
1

You want

df[] <- lapply(df, factor)