R 使用管道和用户定义的函数修改变量以创建是/否

R 使用管道和用户定义的函数修改变量以创建是/否,r,dplyr,user-defined-functions,R,Dplyr,User Defined Functions,我有十几个变量被编码为“0”或“1”,对应于“否”和“是”。我想重命名这些变量并同时重新编码它们。在以下情况下,我可以使用mutate和case_逐个执行此操作: > df$`*weight loss (dich)` [1] 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 [31] 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 [61]

我有十几个变量被编码为“0”或“1”,对应于“否”和“是”。我想重命名这些变量并同时重新编码它们。在以下情况下,我可以使用mutate和case_逐个执行此操作:


> df$`*weight loss (dich)`
  [1] 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
 [31] 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
 [61] 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1
 [91] 1 1 1 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 1 1 1 1
[121] 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1
[151] 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0

df %<>% 
    mutate(weight_loss = case_when(
      df$`*weight loss (dich)` == 0 ~ "No", 
      df$`*weight loss (dich)`  == 1 ~ "Yes"
    ))


>df$`*体重损失(dich)`
[1] 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
[31] 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
[61] 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1
[91] 1 1 1 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 1 1 1 1
[121] 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1
[151] 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
df%%
变异(重量损失=情况)(
df$`*重量损失(dich)`==0~“否”,
df$`*体重损失(dich)`==1~“是”
))
我想写一个函数,在多个变量上执行相同的操作,给定输入,其中x=新名称,y=旧名称。以下是我的尝试,但不起作用:

> ynf <- function(x, y) {
+   df %<>% 
+     mutate(x = case_when(
+     y == 0 ~ "No", 
+     y == 1 ~ "Yes"
+   ))
+ }
> 
> ynf(weight_loss, df$`*weight loss (dich)`)
> 
> glimpse(df$weight_loss)
 NULL
Warning message:
Unknown or uninitialised column: 'weight_loss'. 

>ynf
>ynf(重量损失,df$`*重量损失(dich)`)
> 
>一瞥(df$减肥)
无效的
警告信息:
未知或未初始化列:“失重”。

谢谢你的帮助

我们可以更改函数以计算“x”、“y”,并执行赋值
:=
以创建列

library(dplyr)
library(magrittr)
ynf <- function(x, y) {
 df %<>% 
    mutate(!! enquo(x) := case_when(
     {{y}} == 0 ~ "No", 
     {{y}} == 1 ~ "Yes"
     ))
    }

df <- ynf(weight_loss, `weight loss (dich)`)
glimpse(df)
#Rows: 20
#Columns: 2
#$ `weight loss (dich)` <int> 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1
#$ weight_loss          <chr> "No", "No", "Yes", "No", "Yes", "No", "No", "Yes", "Yes", "Yes", "Yes", "No",…
库(dplyr)
图书馆(magrittr)

ynf我将使用
mutate_at/mutate_all
,这里是一个示例
mtcars%>%mutate_at(vars(vs,am),list(new=~ifelse(.==1,“Yes”,“No”)
set.seed(24)
df <- data.frame(`weight loss (dich)` = sample(0:1, 20, replace = TRUE),
            check.names = FALSE)