我想有选择地运行一个变异,给定一个变量输入。突变体需要在chr列上运行gsub。例如:
thing <- "yes"
starwars %>% mutate(homeworld =
ifelse(thing == "yes",
gsub("oo", "_", homeworld),
homeworld)) %>%
select(name, homeworld)以上代码中的gsub似乎对主世界的第一项执行替换,并将所有的主世界值替换为:
name homeworld
<chr> <chr>
1 Luke Skywalker Tat_ine
2 C-3PO Tat_ine
3 R2-D2 Tat_ine
4 Darth Vader Tat_ine 当我预料到:
name homeworld
<chr> <chr>
1 Luke Skywalker Tat_ine
2 C-3PO Tat_ine
3 R2-D2 Nab_
4 Darth Vader Tat_ine 如果我不包括ifelse语句,这是可行的:
starwars %>% mutate(homeworld = gsub("oo", "_", homeworld))发布于 2021-07-09 13:12:51
使用rowwise
thing <- "yes"
starwars %>%
rowwise() %>%
mutate(homeworld =
ifelse(thing == "yes",
gsub("oo", "_", homeworld),
homeworld)) %>%
select(name, homeworld) %>%
ungroup()
# A tibble: 87 x 2
name homeworld
<chr> <chr>
1 Luke Skywalker Tat_ine
2 C-3PO Tat_ine
3 R2-D2 Nab_
4 Darth Vader Tat_ine
5 Leia Organa Alderaan
6 Owen Lars Tat_ine
7 Beru Whitesun lars Tat_ine 发布于 2021-07-09 13:24:28
备注
这个问题已经被诊断为这里。
问题
根据R文件
ifelse()返回一个与test形状相同的值。
因为test是(logical)标量thing == "yes"
thing == "yes"
# [1] TRUE然后ifelse()只返回(character)标量"Tat_ine"
ifelse(thing == "yes", gsub("oo", "_", starwars$homeworld), starwars$homeworld)
# [1] "Tat_ine" 它作为一个常数在整个homeworld列中循环使用。
解决方案
您可以执行rowwise()操作(使用dplyr),如尤里·萨拉金描述的这里操作,也可以使用dplyr::case_when()高效地将状态向量化。
thing <- "yes"
starwars %>% mutate(homeworld = case_when(thing == "yes" ~ gsub("oo", "_", homeworld),
TRUE ~ homeworld)) %>%
select(name, homeworld)结果(以下抽样)应符合您的期望:
# A tibble: 87 x 2
name homeworld
<chr> <chr>
1 Luke Skywalker Tat_ine
2 C-3PO Tat_ine
3 R2-D2 Nab_
4 Darth Vader Tat_ine
5 Leia Organa Alderaan
6 Owen Lars Tat_ine
7 Beru Whitesun lars Tat_ine
8 R5-D4 Tat_ine
9 Biggs Darklighter Tat_ine
10 Obi-Wan Kenobi Stewjon
# ... with 77 more rowshttps://stackoverflow.com/questions/68317321
复制相似问题