A tidyr
опция с использованием separate
library(dplyr)
library(tidyr)
df %>% separate(code, paste0("code_", 1:3), sep = "/", fill = "right", remove = F)
# code code_1 code_2 code_3
#1 PC211/212.5(C)/664F PC211 212.5(C) 664F
#2 VC23152(A)/23550F VC23152(A) 23550F <NA>
#3 PC459/460(B)M PC459 460(B)M <NA>
#4 PC187(A)/664F PC187(A) 664F <NA>
Обратите внимание, что ожидаемый результат не соответствует вашим входным данным. Например, для строки 1 ожидаемый результат для code_3
дает "PC664F"
, тогда как соответствующая строка ввода - "664F"
. code_2
для той же строки имеет "212.5(C)F"
, тогда как входная строка "212.5(C)"
. Я предполагаю, что это ошибки.
Обновление
Благодаря комментарию @ andrew_reece я (думаю, что) теперь понимаю ваш вопрос. Вот вариант
df %>%
rowid_to_column("row") %>%
separate(code, c("prefix", "main", "suffix"), sep = c(2, -1), remove = F) %>%
separate(main, into = paste0("code_", 1:3), sep = "/", fill = "right") %>%
gather(key, entry, starts_with("code_")) %>%
filter(!is.na(entry)) %>%
unite(entry, prefix, entry, suffix, sep = "") %>%
spread(key, entry) %>%
select(-row)
Объяснение: Сначала мы separate
добавляем префиксы и суффиксы из code
, затем separate
отдельные компоненты из основной code
части. Мы изменяем форму с широкой на длинную, удаляем NA
записи и объединяем каждый code
компонент с prefix
и suffix
перед изменением формы с длинной на широкую.
Это воспроизводит ваш ожидаемый результат за исключением code_2
в строке 1.
Альтернатива
В качестве альтернативного подхода может оказаться более полезным хранить коды с префиксами и суффиксами в столбце list
, а не хранить их в широком формате с дополнительными столбцами code_1
, code_2
и так далее. Преимущество этого заключается в том, что вам не нужно будет жестко кодировать количество кодов, которое у вас есть в столбце code
; следующий подход будет работать для любого количества кодов в code
и предполагает только, что
- первые 2 символа
code
определяют prefix
- последний символ
code
- это suffix
.
df %>%
separate(code, c("prefix", "main", "suffix"), sep = c(2, -1), remove = F) %>%
transmute(
code,
codes_as_list = pmap(
list(prefix, str_split(main, "/"), suffix),
function(x, y, z) paste0(x, y, z)))
# code codes_as_list
#1 PC211/212.5(C)/664F PC211F, PC212.5(C)F, PC664F
#2 VC23152(A)/23550F VC23152(A)F, VC23550F
#3 PC459/460(B)M PC459M, PC460(B)M
#4 PC187(A)/664F PC187(A)F, PC664F
Обратите внимание, что codes_as_list
теперь является столбцом list
с правильно заданными / суффиксными кодами, что упрощает работу с элементами с помощью механизма purrr::map
.