Сложное условие if для выбора переменных с помощью cross () - PullRequest
2 голосов
/ 12 апреля 2020

Допустим, я хочу преобразовать столбцы в число c, если они содержат 0, 1, 2, NA и имеют 3 уникальных значения или меньше.

Ранее я выполнял это с помощью:

outcome_data<- outcome_data %>% dplyr::mutate_if(~any(c(0, 1, 2, NA) %in% .x) & length(unique(as.numeric(.x))) <= 3, as.numeric)

Но неясно, как ссылаться на .x в качестве первого аргумента across() для создания сложного условия if. Ниже приведено сообщение об ошибке:

объект '.x' не найден

outcome_data %>% mutate(across(any(c(0, 1, 2, NA) %in% .x) & length(unique(.x)) < 3), as.numeric))

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Я ценю ответы каждого на этот счет. И я согласен, мне кажется, что across() не облегчает подобные вещи, и что нужны дополнительные шаги.

Вот как я это решил:

dummy_vars<- outcome_data %>% purrr::keep(~all(c("0", "1") %in% .x) & length(unique(.x)) <= 3) %>% names()

outcome_data<- outcome_data %>% dplyr::mutate(across(all_of(dummy_vars), as.numeric))
1 голос
/ 12 апреля 2020

Для подстановки столбцов с допустимым вектором индекса нам понадобится цифра c или символьный вектор, здесь можно использовать which и sapply

#devtools::install_github("tidyverse/dplyr")
library(dplyr, warn.conflicts = FALSE)
mtcars %>% 
  # which(sapply(., function(x) any(c(0, 1, 2, NA) %in% x) & n_distinct(x) < 3))
  mutate(across(.cols = which(sapply(., function(x) n_distinct(x)<3)), as.character)) %>% 
  str()

С ?across

cols, .cols: столбцы tidy-select для преобразования. Поскольку cross () используется в таких функциях, как summaze () и mutate (), вы не можете выбирать или вычислять группируемые переменные.

...