Set factor level order for multiple columns in a data frame

I loaded data from a CSV file into a data frame. Each column is a survey question, and all answers refer to the five-point Likert scale with labels: ("No", "Low", "Medium", "High", "Very High").

When I read the data first, R correctly interprets these values ​​as factors, but does not know what should be ordering. I want to indicate what the order is for the values, so I can do some numerical calculations. I thought the following code would work:

X <- read.csv('..')
likerts <- data.frame(apply(X, 2, function(X){factor(X, 
             levels = c("None", "Low", "Medium", "High", "Very High"), 
             ordered = T)}))

Instead, all level data is converted to rows. How to do it right?

+3
source share
2 answers

plyr ( Joris ):

> require(plyr)
> Y <- catcolwise( function(v) ordered(v, levels = letters[5:1]))(X)

> str(Y)
'data.frame':   15 obs. of  2 variables:
 $ var1: Ord.factor w/ 5 levels "e"<"d"<"c"<"b"<..: 5 4 3 2 1 5 4 3 2 1 ...
 $ var2: Ord.factor w/ 5 levels "e"<"d"<"c"<"b"<..: 5 5 5 4 4 4 3 3 3 2 ...

, catcolwise , X, , . , : catcolwise - , , " " . , : fn <- catcolwise(...); Y <- fn(X). , colwise ( ) numcolwise ( ).

+4

data.frame, R ( stringsAsFactors = FALSE ). as.data.frame. :

X <- data.frame(
  var1=rep(letters[1:5],3),
  var2=rep(letters[1:5],each=3)

)
likerts <- as.data.frame(lapply(X, function(X){ordered(X,
              levels = letters[5:1],labels=letters[5:1])}))

> str(likerts)
'data.frame':   15 obs. of  2 variables:
 $ var1: Ord.factor w/ 5 levels "e"<"d"<"c"<"b"<..: 5 4 3 2 1 5 4 3 2 1 ...
 $ var2: Ord.factor w/ 5 levels "e"<"d"<"c"<"b"<..: 5 5 5 4 4 4 3 3 3 2 ...

sidenote ordered() , lapply(X,...) , apply(X,2,...) .

+7

Source: https://habr.com/ru/post/1789542/


All Articles