首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dplyr中的gsub会发生变异,如果语句返回第一项而不是选定的项。

dplyr中的gsub会发生变异,如果语句返回第一项而不是选定的项。
EN

Stack Overflow用户
提问于 2021-07-09 13:06:22
回答 2查看 344关注 0票数 0

我想有选择地运行一个变异,给定一个变量输入。突变体需要在chr列上运行gsub。例如:

代码语言:javascript
复制
thing <- "yes"

starwars %>% mutate(homeworld = 
                    ifelse(thing == "yes", 
                           gsub("oo", "_", homeworld), 
                           homeworld)) %>%
            select(name, homeworld)

以上代码中的gsub似乎对主世界的第一项执行替换,并将所有的主世界值替换为:

代码语言:javascript
复制
   name               homeworld
   <chr>              <chr>    
 1 Luke Skywalker     Tat_ine  
 2 C-3PO              Tat_ine  
 3 R2-D2              Tat_ine  
 4 Darth Vader        Tat_ine 

当我预料到:

代码语言:javascript
复制
   name               homeworld
   <chr>              <chr>    
 1 Luke Skywalker     Tat_ine  
 2 C-3PO              Tat_ine  
 3 R2-D2              Nab_
 4 Darth Vader        Tat_ine 

如果我不包括ifelse语句,这是可行的:

代码语言:javascript
复制
starwars %>% mutate(homeworld = gsub("oo", "_", homeworld))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-09 13:12:51

使用rowwise

代码语言:javascript
复制
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  
票数 2
EN

Stack Overflow用户

发布于 2021-07-09 13:24:28

备注

这个问题已经被诊断为这里

问题

根据R文件

ifelse()返回一个与test形状相同的值。

因为test是(logical)标量thing == "yes"

代码语言:javascript
复制
thing == "yes"

# [1] TRUE

然后ifelse()只返回(character)标量"Tat_ine"

代码语言:javascript
复制
ifelse(thing == "yes", gsub("oo", "_", starwars$homeworld), starwars$homeworld)

# [1] "Tat_ine" 

它作为一个常数在整个homeworld列中循环使用。

解决方案

您可以执行rowwise()操作(使用dplyr),如尤里·萨拉金描述的这里操作,也可以使用dplyr::case_when()高效地将状态向量化。

代码语言:javascript
复制
thing <- "yes"

starwars %>% mutate(homeworld = case_when(thing == "yes" ~ gsub("oo", "_", homeworld),
                                          TRUE ~ homeworld)) %>%
  select(name, homeworld)

结果(以下抽样)应符合您的期望:

代码语言:javascript
复制
# 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 rows
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68317321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档