R 如何使用准旋转以编程方式重新编码变量?

R 如何使用准旋转以编程方式重新编码变量?,r,dplyr,rlang,R,Dplyr,Rlang,我有以下数据集,并希望重新编码变量 library(tidyverse) library(rlang) mytib <- tribble(~colA, ~colB, ~colC, "good", "bad", "better", "better", "bad", "worse", "good", &quo

我有以下数据集,并希望重新编码变量

library(tidyverse)
library(rlang)
mytib <- tribble(~colA, ~colB, ~colC,
        "good", "bad", "better",
        "better", "bad", "worse",
        "good", "best", "good")
当我跑的时候

recode_attractiveness(mytib, attractiveness_vars, attractiveness_lvls_neg, attractiveness_lvls_pos, attractiveness_lvls_new)

我收到一个错误ℹ 输入“吸引力变量”必须是大小[NROW]或1,而不是[LengthAttractive\u vars]。注意,它实际上告诉我数字,我只是想让它更容易阅读

可能有一种更简单的方法来解决这个问题。我很想知道是否有一种准旋转的方法来解决这个问题,或者不管是否有一个优雅的编程解决方案,也就是说,当。。。代码

预期的输出应该如下所示

colA   colA_bin  colB  colB_bin   colC     colC_bin
"good" "awesome" "bad" "terrible" "better" "awesome"
...

可能会跳过函数定义,并在整个过程中使用


可能会跳过函数定义,并在整个过程中使用


你能澄清一下你期望的输出是什么吗?以一个元素开始还是以一个元素结束。可能您需要匹配mytib%>%selectmatches“^col.[ABC]$”。另外,{{}}正在寻找没有引号的列名。您能澄清一下您期望的输出是什么吗?以单个元素开头还是以单个元素结尾。可能您需要匹配mytib%>%selectmatches“^col.[ABC]$”。另外,{{}正在寻找没有引号的列名。你能解释一下{col}}bin的作用吗?另外,是否有一种方法可以使用.relocate来更改此函数调用中的顺序?来自HelpCross部分。名称:描述如何命名输出列的粘合规范。这可以使用{.col}表示所选列名,{.fn}表示所应用函数的名称。对于单个函数的情况,默认NULL相当于{.col},对于列表用于.fns的情况,默认NULL相当于{.col}{.fn}。这显然意味着更正确的版本是{.col}\u bin。@TeaTree对于排序,您可以使用%>%selectsortcurrent\u varst,这似乎也会更改其他变量的位置。有没有一种简单的方法可以将变量放在我们刚刚创建的每个变量之后?@TeaTree我不知道有什么简单的方法可以将新列直接放在旧列的右侧。类似于重新定位或粘贴吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引吸引?另外,是否有一种方法可以使用.relocate来更改此函数调用中的顺序?来自HelpCross部分。名称:描述如何命名输出列的粘合规范。这可以使用{.col}表示所选列名,{.fn}表示所应用函数的名称。对于单个函数的情况,默认NULL相当于{.col},对于列表用于.fns的情况,默认NULL相当于{.col}{.fn}。这显然意味着更正确的版本是{.col}\u bin。@TeaTree对于排序,您可以使用%>%selectsortcurrent\u varst,这似乎也会更改其他变量的位置。有没有一种简单的方法可以将变量放在我们刚刚创建的每个变量之后?@TeaTree我不知道有什么简单的方法可以将新列直接放在旧列的右侧。例如重新定位或粘贴吸引力变量,粘贴吸引力变量,将使它们彼此相邻,但它们将被移动到最后。
colA   colA_bin  colB  colB_bin   colC     colC_bin
"good" "awesome" "bad" "terrible" "better" "awesome"
...
library(dplyr) # Version >= 1.0.0
mytib %>% 
  mutate(across(one_of(attractiveness_vars),
                ~ factor(case_when(. %in% attractiveness_lvls_neg ~ attractiveness_lvls_new[1],
                                   . %in% attractiveness_lvls_pos ~ attractiveness_lvls_new[2],
                                   TRUE ~ NA_character_),
                         levels = attractiveness_lvls_new),
                .names = "{col}_bin"))
# A tibble: 3 x 6
  colA   colB  colC   colA_bin colB_bin colC_bin
  <chr>  <chr> <chr>  <fct>    <fct>    <fct>   
1 good   bad   better awesome  terrible awesome 
2 better bad   worse  awesome  terrible terrible
3 good   best  good   awesome  awesome  awesome 
library(forcats)
attractiveness_factors <- setNames(list(attractiveness_lvls_neg, attractiveness_lvls_pos),
                                   attractiveness_lvls_new)
attractiveness_factors
#$terrible
#[1] "bad"   "worse"
#$awesome
#[1] "good"   "better" "best"  

mytib %>% 
  mutate(across(one_of(attractiveness_vars),
                ~ fct_collapse(.,!!!attractiveness_factors),
                .names = "{col}_bin"))