Robin Lindström
Robin Lindström

Reputation: 682

How to handle NA with str_c in this case

I got help with this questions a while ago: How to replace multiple values in a string depending on a list of keys

Now I need to take into account that some keys are not to be "translated". So in this case I want the key1-4 should be translated into code1-4. I want it to be able to handle keys that arent in the key_code translation. If I add a key that is missing from the keycode, say keyx, somewhere where there is already another valid key value, I can just filter the NA that appears when joining with the key_codes. But if I have an id which has only the keyx value, that whole row dissapears and I want to keep it (it can show up as NA for example). Any ideas on how to solve that?

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=";"))

Upvotes: 2

Views: 983

Answers (1)

akrun
akrun

Reputation: 887088

We could use an if/else condition to check if all the elements in the 'code' are NA, then return NA or else to paste the non-NA elements

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')

-output

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

Upvotes: 2

Related Questions