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

问题描述 投票:2回答:3

我有以下数据:

  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', .)))

但是,这并不是很有效。

r dplyr mutate
3个回答
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', .))也可以做到这一点。

4
投票

mutatereplace的一种方式:

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
投票

一个选项也是使用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"
© www.soinside.com 2019 - 2024. All rights reserved.