【问题标题】:How to handle NA with str_c in this case在这种情况下如何使用 str_c 处理 NA
【发布时间】:2020-12-09 19:38:13
【问题描述】:

不久前我就这个问题得到了帮助: How to replace multiple values in a string depending on a list of keys

现在我需要考虑到某些键不能被“翻译”。所以在这种情况下,我希望 key1-4 应该被翻译成 code1-4。我希望它能够处理 key_code 翻译中没有的键。如果我添加一个键码中缺少的键,比如 keyx,在某个已经存在另一个有效键值的地方,我可以过滤加入 key_codes 时出现的 NA。但是,如果我有一个只有 keyx 值的 id,那么整行就会消失,我想保留它(例如,它可以显示为 NA)。关于如何解决这个问题的任何想法?

library(dplyr)
library(tidyr)
library(stringr)

values = tibble(id = 1:4, values = c("key1;keyx", "key3;key4;key1", "key2;key1", "keyx"))
key_code = tibble(key = c("key1", "key2", "key3", "key4"), code = c("code1", "code2", "code3", "code4"))

values %>% 
  separate_rows(values) %>% 
  left_join(key_code, by = c("values" = "key")) %>% 
  group_by(id) %>%
  filter(!is.na(code)) %>% 
  summarise(code = str_c(code, collapse=";"))

【问题讨论】:

    标签: r stringr


    【解决方案1】:

    我们可以使用if/else条件来检查if'code'中的所有元素都是NA,然后将NAelse返回到paste非NA元素

    library(dplyr)
    library(tidyr)
    library(stringr)
    values %>%
       separate_rows(values) %>% 
       left_join(key_code, by = c("values" = "key")) %>% 
       group_by(id) %>% 
       summarise(code = if(all(is.na(code))) NA_character_ else 
               str_c(str_replace_na(code, ""), collapse=";"), .groups = 'drop')
    

    -输出

    # A tibble: 4 x 2
    #     id code             
    #  <int> <chr>            
    #1     1 code1;           
    #2     2 code3;code4;code1
    #3     3 code2;code1      
    #4     4 <NA>           
    

    【讨论】:

      猜你喜欢
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      相关资源
      最近更新 更多