我有以下数据:
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', .)))
但是,这并不是很有效。
你和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')))
;list
和最新的dplyr
版本,所以mutate_at(2:3, ~ ifelse(region == 'all', 'x', .))
也可以做到这一点。与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
一个选项也是使用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"