Мутировать несколько переменных на основе заданного условия - PullRequest
2 голосов
/ 20 марта 2019

У меня есть следующие данные:

  library(dplyr)

     d <- data_frame(
      region = c('all', 'nj', 'rkl', 'all'),
      figures= c(5, 7, 4, 8),
      figures2 = c(3, 5, 6, 7))

Я хотел бы использовать dplyr, чтобы сказать, когда 'region' = 'all', затем повернуть 'figure' и 'figure2' в 'x'.Я не хочу использовать mutate для создания новых переменных, я хочу изменить значения в переменных, которые уже существуют.Таким образом, данные будут выглядеть так:

  d2 <- data_frame(
          region = c('all', 'nj', 'rkl', 'all'),
          figures= c(x, 7, 4, x),
          figures2 = c(x, 5, 6, x))

Я думаю, мне нужно что-то вроде этого:

 d %>% mutate_at(vars(1:3), funs(ifelse(region = 'all', 'x', .)))

Однако, это не совсем работает.

Ответы [ 3 ]

4 голосов
/ 20 марта 2019

Вы были на правильном пути с mutate_at:

d %>% 
  mutate_at(vars(2:3), list(~ ifelse(region == 'all', 'x', .)))

Вывод:

# A tibble: 4 x 3
  region figures figures2
  <chr>  <chr>   <chr>   
1 all    x       x       
2 nj     7       5       
3 rkl    4       6       
4 all    x       x   

Вы можете просто заменить 'x' на число, если необходимо.

EDIT .

  • Я также думаю, что replace - лучшая альтернатива, вы также можете просто сделать d %>% mutate_at(vars(2:3), list(~ replace(., region == 'all', 'x')));
  • Более того, как отмечает @Moody_Mudskipper, нет необходимости в list с самой новой dplyr версией, так что mutate_at(2:3, ~ ifelse(region == 'all', 'x', .)) тоже справится с этой задачей.
4 голосов
/ 20 марта 2019

В одну сторону с mutate и replace:

d %>% 
  mutate(figures = replace(figures, region == 'all', 10)) %>%
  mutate(figures2 = replace(figures2, region == 'all', 10))

# A tibble: 4 x 3
  region figures figures2
  <chr>    <dbl>    <dbl>
1 all         10       10
2 nj           7        5
3 rkl          4        6
4 all         10       10

Я использую 10 здесь как ваш x

3 голосов
/ 20 марта 2019

Можно также использовать case_when

library(dplyr)
d %>%
   mutate_if(is.numeric, list(~ case_when(region == "all" ~ 'x',
                                         TRUE ~ as.character(.) )))
# A tibble: 4 x 3
#  region figures figures2
#  <chr>  <chr>   <chr>   
#1 all    x       x       
#2 nj     7       5       
#3 rkl    4       6       
#4 all    x       x       

A base R компактный вариант будет

d[d$region == "all", -1] <- "x"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...