r - 使用每个输入变量的多个输出变量来改变和 case_when
问题描述
我有一个大数据框(在一个小样本下方),我需要根据某些条件将所有以相同前缀开头的列转换为多个列,保留原始变量并将原始后缀携带到新变量中。
数据:
egp <= structure(list(EGP_2007 = structure(c("", "", "II", "", "", "", "", "", "V", "VI"), format.sas = "$"),
EGP_2008 = structure(c("", "", "IIIb", "", "", "", "IIIb", "", "V", "VI"), format.sas = "$"),
EGP_2009 = structure(c("", "", "IIIb", "", "", "", "I", "II", "V", "I"), format.sas = "$"),
EGP_2010 = structure(c("", "", "", "", "", "I", "", "II", "V", "I"), format.sas = "$"),
EGP_2011 = structure(c("I", "II", "", "", "", "I", "", "II", "V", "I"), format.sas = "$"),
EGP_2012 = structure(c("I", "II", "", "", "I", "VIIb", "I", "II", "I", "I"), format.sas = "$"),
EGP_2013 = structure(c("I", "II", "", "", "I", "VIIb", "IIIa", "II", "I", "I"), format.sas = "$"),
EGP_2014 = structure(c("I", "II", "", "IIIb", "I", "VIIb", "IIIa", "II", "I", "I"), format.sas = "$"),
EGP_2015 = structure(c("I", "IIIa", "", "IIIb", "I", "VIIb", "IIIa", "II", "I", "I"), format.sas = "$"),
EGP_2016 = structure(c("I", "IIIa", "", "IIIb", "I", "", "IIIa", "IIIa", "I", "I"), format.sas = "$"),
EGP_2017 = structure(c("", "", "", "IIIb", "I", "", "IIIa", "II", "I", "I"), format.sas = "$"),
EGP_2018 = structure(c("", "II", "", "IIIb", "I", "", "IIIa", "IIIa", "I", "IIIb"), format.sas = "$")), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))
我尝试了什么:
我试图用这个 SO 回答我的问题,但我收到以下错误:
Error: Problem with `mutate()` input `..1`. x Can't convert a double vector to function i Input `..1` is `across(...)`.
这是我的代码:
egp_2 <- egp %>%
mutate(across(contains("EGP"),
.fns = list(professional = case_when(. %in% c("I", "II") ~ 1,
. %in% c("IIIa", "IIIb", "V", "VI", "VIIa", "VIIb") ~ 0,
T ~ NA_real_),
routine_non_manual = case_when(. %in% c("IIIa", "IIIb", "V") ~ 1,
. %in% c("I", "II", "VI", "VIIa", "VIIb") ~ 0,
T ~ NA_real_),
manual = case_when(. %in% c("VI", "VIIa", "VIIb") ~ 1,
. %in% c("I", "II", "IIIa", "IIIb", "V") ~ 0,
T ~ NA_real_)),
.names = "{fn}_{col}" ))
任何解决方案表示赞赏。原始变量包含职业分类,我想将其转换为用于绘图和回归的子类型假人。
解决方案
我们需要匿名函数
egp %>%
mutate(across(contains("EGP"),
.fns = list(professional = ~ case_when(. %in% c("I", "II") ~ 1,
. %in% c("IIIa", "IIIb", "V", "VI", "VIIa", "VIIb") ~ 0,
T ~ NA_real_),
routine_non_manual =~ case_when(. %in% c("IIIa", "IIIb", "V") ~ 1,
. %in% c("I", "II", "VI", "VIIa", "VIIb") ~ 0,
T ~ NA_real_),
manual = ~ case_when(. %in% c("VI", "VIIa", "VIIb") ~ 1,
. %in% c("I", "II", "IIIa", "IIIb", "V") ~ 0,
T ~ NA_real_)),
.names = "{fn}_{col}" ))
推荐阅读
- c - 如何在 FFmpeg 代码 (C) 中设置帧速率/FPS?
- reactjs - 浏览器未在 React 应用程序中维护正确的历史记录
- android - 我希望 Camera.main 跟随播放器,它在编辑器中运行良好,但在 Android Deice 上却不行
- flutter - 使用不包含 MediaQuery 的上下文调用 MediaQuery.of()。(紧急援助)
- sql - 使用带有组合框的 Vb.net 显示数据库中的数据
- web-services - Web 框架会在读取正文之前检查授权标头吗?
- tailwind-css - 将鼠标悬停在 Tailwindcss 中时如何增加文本输入宽度(带过渡)
- python - 如何在不刷新烧瓶项目页面的情况下更新值
- ios - 错误:属性声明中应有“var”关键字
- linux - 为什么nop操作会导致sigint?