r - 使用 dplyr 使用变量和级别列表将字符数据转换为因子
问题描述
我正在处理调查数据,我需要将响应值编码为因素(例如,非常不同意、不同意、同意、非常同意)。不同的问题有不同的回答选项,需要适当地编码。我有一个列出每个问题和有序响应选项的 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
解决方案
有可能
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)])))
推荐阅读
- flutter - 应用程序已停止工作我该如何解决这个问题
- node.js - 我可以在不运行“npm run build”的情况下从快速服务器提供创建反应应用程序吗?
- android - 当 Spinner 下拉项聚焦(未选中)时,如何更改其背景颜色?
- c# - 为什么我在尝试将元数据添加到 GIF 图像时会出现异常?
- laravel - Laravel - “未找到请求的资源 /2010-04-01/Accounts//Messages.json”
- laravel - 有没有办法使用 jquery 插件将 pdf 文件上传到 laravel 项目?
- delphi - 如何使用 Delphi 在 Openoffice 文档的页眉/页脚/表格中搜索文本标签并替换为图像
- java - 在哪里可以找到 DropWizard 嵌入式 http 服务器的 conf?
- git - 尝试推送到 GitHub
- google-app-maker - 显示目录中的全名