Изменить переменную для создания Да / Нет с трубами и пользовательской функцией - PullRequest
1 голос
/ 03 марта 2020

У меня есть дюжина переменных, которые имеют код «0» или «1», соответствующие «Нет» и «Да». Я хотел бы переименовать переменные и перекодировать их одновременно. Я могу сделать это один за другим, используя mutate и case_when:


> 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"
    ))

Я хотел бы написать функцию, которая выполняет одно и то же действие над несколькими переменными, учитывая входные данные, где 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'. 

Спасибо за любую помощь !!

1 Ответ

1 голос
/ 03 марта 2020

Мы можем изменить функцию для оценки '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",…

data

set.seed(24)
df <- data.frame(`weight loss (dich)` = sample(0:1, 20, replace = TRUE),
            check.names = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...