【问题标题】:Tidy conditional replacement整洁的条件替换
【发布时间】:2018-03-12 15:18:32
【问题描述】:

有没有更整洁的方式来实现以下?

d = data_frame(domain = c('http:news.com/', 'http:news.com/', 'http:news.com/'),
               url = c('http:cnn.com/article/123', 'politics', 'economics'))

d %>% mutate(url = {
  f = !str_detect(url, '^http'); # filter
  replace(url, f, paste0(domain[f], url[f]))
})
# A tibble: 3 x 2
  domain         url                     
  <chr>          <chr>                   
1 http:news.com/ http:cnn.com/article/123
2 http:news.com/ http:news.com/politics  
3 http:news.com/ http:news.com/economics 

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    case_when 可能更容易

    d %>% mutate(url = case_when(
      !str_detect(url, '^http') ~ paste0(domain, url), 
      TRUE~url))
    

    或者只是一个if_else

    d %>% mutate(url = if_else(!str_detect(url, '^http'), 
      paste0(domain, url), 
      url))
    

    【讨论】:

    • 谢谢,我认为if_else 是最好的
    【解决方案2】:

    基础 R 中的一种整洁方式:

    idx <- !grepl('^http', d$url)
    d$url[idx] <- do.call(paste0, d[idx,])
    

    给出:

    > d
    # A tibble: 3 x 2
      domain         url                     
      <chr>          <chr>                   
    1 http:news.com/ http:cnn.com/article/123
    2 http:news.com/ http:news.com/politics  
    3 http:news.com/ http:news.com/economics
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-06
      • 2021-11-08
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多