根据给定条件突变多个变量

时间:2019-03-20 12:10:09

标签: r dplyr mutate

我有以下数据:

  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'然后将'figures'和'figures2'设置为'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 个答案:

答案 0 :(得分:4)

使用legendmutate的一种方式:

replace

我在这里用10作为您的x

答案 1 :(得分:4)

您在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'替换为数字。

编辑

  • 我还认为replace是更好的选择,您也可以执行d %>% mutate_at(vars(2:3), list(~ replace(., region == 'all', 'x')))
  • 此外,正如@Moody_Mudskipper指出的那样,无需使用最新的list版本的dplyr,因此mutate_at(2:3, ~ ifelse(region == 'all', 'x', .))也可以完成这项工作。

答案 2 :(得分:3)

也可以选择使用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       

一个base R紧凑型选项就是

d[d$region == "all", -1] <- "x"