我有以下数据:
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', .)))
但是,这不太起作用。
答案 0 :(得分:4)
使用legend
和mutate
的一种方式:
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')))
; 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"