Как заменить несколько значений в строке в зависимости от списка ключей - PullRequest
1 голос
/ 26 апреля 2020

У меня есть эти данные, которые я хочу заменить каждым значением на фиксированное значение из другого списка

values
key1
key3;key4;key1
key2;key1

Вот список, который «переводит» каждый ключ во что-то другое (это всего лишь примеры, поэтому не достаточно просто заменить слово «ключ» на «код».

key    code
key1  code1
key2  code2
key3  code3
key4  code4

Таким образом, конечный продукт должен выглядеть следующим образом:

values
code1
code3;code4;code1
code2;code1

Вот как я пытался решить это но застряло:

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

values %>% 
  mutate(values = strsplit(values, ";")) %>% 
  unnest(values) %>% 
  left_join(key_code, by = c("values" = "key"))

Вот что я получаю

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

Отсюда я хочу получить:

    id code 
  <int> <chr>
1     1 code1
2     2 code3;code4;code1
3     3 code2;code1

1 Ответ

1 голос
/ 26 апреля 2020

Мы можем использовать paste или str_c. Вместо strsplit, другой вариант - separate_rows

library(dplyr)
library(tidyr)
library(stringr)
values %>% 
    separate_rows(values) %>% 
    left_join(key_code, by = c("values" = "key")) %>% 
    group_by(id) %>%
    summarise(code = str_c(code, collapse=";"))
# A tibble: 3 x 2
#     id code             
#  <int> <chr>            
#1     1 code1            
#2     2 code3;code4;code1
#3     3 code2;code1      

Или более простой вариант - str_replace, который может принимать именованный vector или list и использовать его для замены значения в строке без разделения или объединения

values %>% 
  mutate(values = str_replace_all(values, set_names(key_code$code, key_code$key)))
# A tibble: 3 x 2
#     id values           
#  <int> <chr>            
#1     1 code1            
#2     2 code3;code4;code1
#3     3 code2;code1      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...