首页 > 解决方案 > 如何将许多“chr”转换为具有有序水平的因子?

问题描述

我正在尝试分析大量调查数据,这些数据具有多种不同类型的响应选项。对于某些问题,回答是“非常不同意”到“非常同意”,而对于其他问题,可能是“负面影响”到“正面影响”到目前为止,我已经制作了映射到不同响应选项的列对象

impactvars <- c(21:23,130:134)

motiatingvars <- c(24:31)

importantvars <- c(32:37,45:49,70:84,112:117)

satisfiedvars <- c(38:44, 50:54,118:123)

likertvars <- c(55:69,136:152,169:172)

infovars <- c(85:92,101)

usefulvars <- c(93:100, 102, 153:168)

comfortvars <- c(103:111)

我已经能够通过以下方式使用 lapply 将所有这些转换为一般因素

mydata[,names] <- lapply(mydata[,names] , factor)

我的问题是,因为这些数据本质上是序数,所以我需要指定级别,而不仅仅是让 R 随机分配它们。不幸的是,当我尝试指定级别时,代码不起作用。这是我尝试过的代码:

teamsdata_cleaned[,impactvars] <- lapply(teamsdata_cleaned[,impactvars], factor(teamsdata_cleaned[,impactvars],ordered = TRUE, 
                                  levels = c("Negative impact", 
                                             "Slight negative impact", "No impact",
                                             "Slight positive impact", 
                                             "Positive impact")))

有没有办法将许多数字列强制转换为具有指定水平的因子?

标签: rlapply

解决方案


我们可以用

teamsdata_cleaned[,impactvars] <- lapply(teamsdata_cleaned[,impactvars], function(x) factor(x,ordered = TRUE, 
                              levels = c("Negative impact", 
                                         "Slight negative impact", "No impact",
                                         "Slight positive impact", 
                                         "Positive impact")))

或使用tidyverse

library(dplyr)
teamsdata_cleaned <- teamsdata_cleaned %>%
     mutate(across(all_vars(impactvars), ~ factor(., 
       ordered = TRUE, levels =  c("Negative impact", 
                                         "Slight negative impact", "No impact",
                                         "Slight positive impact", 
                                         "Positive impact"))))

推荐阅读