Dani
Dani

Reputation: 161

Convert all variables into ordered factors

I am using the semTools package to carry out EFA using categorical data. The efaUnrotate() function requires variables as ordered factors.

I am trying to convert all of my already factor variables into an ordered one using a simple code, which does not seem to work unfortunately. I wonder if anyone had an explanation for this?

My data:

test <- structure(list(fp_weightloss = structure(c(1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("0", "1"), class = "factor"), fp_gripstrength = structure(c(1L, 
2L, 1L, 1L, 1L, 1L), .Label = c("0", "1"), class = "factor"), 
    fp_walktime = structure(c(2L, 1L, 2L, 2L, 1L, 1L), .Label = c("0", 
    "1"), class = "factor"), fp_metmins = structure(c(2L, 1L, 
    1L, 1L, 2L, 1L), .Label = c("0", "1"), class = "factor")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -6L))

My code:

test_ord <- as.data.frame(sapply(test, as.ordered))

sapply(test_ord, class)

Results in no change:

  fp_weightloss fp_gripstrength     fp_walktime      fp_metmins 
       "factor"        "factor"        "factor"        "factor" 

When I would expect:

class(as.ordered(test$fp_weightloss))
[1] "ordered" "factor" 

Upvotes: 1

Views: 545

Answers (1)

Konrad Rudolph
Konrad Rudolph

Reputation: 545865

The problem is sapply: best avoid it entirely, since its implicit conversions often invisibly mess with data, and they do here. Use lapply instead:

test_ord <- as.data.frame(lapply(test, as.ordered))

In general I prefer using vapply since it handles non-list return values, but getting vapply to work with S3 classes doesn’t seem possible.

Upvotes: 1

Related Questions