使用变量和水平列表,使用dplyr将字符数据转换为因子。

3
我正在处理调查数据,需要将响应值编码为因子(例如:非常不同意、不同意、同意、非常同意)。不同的问题有不同的响应选项,需要适当编码。我有一个Excel文件,列出了每个问题和有序的响应选项。我已经编写了一个for循环来转换所有变量,但希望了解如何使用purrr或dplyr语法来完成它。
以下是一个简单的示例:
library(tidyverse)

dat <- iris %>% 
  mutate(
    Species = as.character(Species),
    second_var = as.character(round(Sepal.Length)))

factor_map <- data.frame(
  var = c("Species", "second_var"), 
  response_opts = c("setosa,versicolor,virginica", 
               "4,5,6,7,8")) 

# convert character string of options into lists
factor_map2 <- factor_map %>% 
  mutate(levels = str_split(response_opts, ","))

# simple for loop                  
dat2 <- dat
for (i in 1:nrow(factor_map2)) {
  v <- factor_map2$var[i]
  l <- factor_map2$levels[[i]]
  dat2[[v]] = factor(dat2[[v]], levels = l)
  rm(v, l)
}

# How to use factor_map to convert the columns in dat to factors? 

# map2 doesn't seem to work, unclear why it says .x has length of 6
dat %>% 
  map2(factor_map2$var, factor_map2$levels,
       function(x, y) factor(x, levels = y))

# Can I pass a vector of variable specific levels into across?
dat %>% 
  mutate(across(factor_map2$var, factor, # somehow pass in the levels


它们已经被编码为因子了。你到底想要什么? - Onyambu
如果不清楚的话,我写了一个for循环来做我需要的事情,但是我想请教一下如何用另一种方法解决这个问题。 - Lief Esbenshade
1个回答

1

它可以是

map2_dfc(factor_map2$var, factor_map2$levels, 
      ~ factor(dat[[.x]], levels = .y))%>%
   setNames(factor_map2$var)

另一种选项是不使用任何新的包,只使用dplyr:

dat %>%
     mutate(across(all_of(factor_map2$var), ~ factor(., levels = 
           factor_map2$levels[match(cur_column(), factor_map2$var)])))

1
谢谢,这很有帮助。我明白了,我的错误是将要修改的数据传入管道,而不是将参数迭代的表传入管道。 - Lief Esbenshade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接