#r #dplyr #stringr
#r #dplyr #stringr
Вопрос:
У меня есть строка, подобная этой.
"457, 1480-(5, 12), 83-(1, 2), 484, 484-(2, 3, 8)"
Я хочу присвоить номер заголовка для каждого элемента только при наличии круглых скобок.
Мой желаемый результат таков
"457, 1480-5, 1480-12, 83-1, 83-2, 484, 484-2, 484-3, 484-8"
как я могу это сделать?
Ответ №1:
Я не уверен, что полностью ответил на вопрос, но я изменил первый список на второй список (во фрейме данных).
library(tidyverse)
library(stringi)
df <- tibble::tribble(
~column,
"457, 480-(5, 12), 483-(1, 2), 484, 484-(2, 3, 8)"
)
Следующее разделяет части, используя запятую в качестве разделителя, удаляет скобки, затем я использовал {stringi} для переформатирования чисел. Я создал 2 дополнительных столбца, один для основного 3-значного номера (main_number) и один для номера подмножества (обозначается -). После переформатирования я взял main_number, если не было подмножества, а для остальных вставил два столбца main_number и subset .
df2 <- df %>%
mutate(split_out = strsplit(as.character(column), ",")) %>%
tidyr::unnest(split_out) %>%
select(-column) %>%
mutate(split_out = str_remove(split_out, "[()]"),
split_out = str_trim(split_out), # has trailing whitespace
main_number = case_when(stri_length(split_out) == 3 ~ split_out,
TRUE ~ substr(split_out, 1, str_locate(split_out, "-") -1)),
subset = case_when(str_detect(split_out, "-") == TRUE ~ substr(split_out,
str_locate(split_out, "-"), # where - appears 1
stri_length(split_out)), # the end of the string
stri_length(split_out) < 3 ~ paste0("-", split_out),
TRUE ~ NA_character_)) %>%
fill(main_number, .direction = c("down")) %>% # fill down so the main number is copied down
mutate(new_number = case_when(is.na(subset) ~ main_number,
TRUE ~ paste0(main_number, subset)
)) %>%
select(new_number)
Комментарии:
1. большое вам спасибо. К сожалению, у меня большой набор данных, и длина полосы (split_out) не всегда равна 3. Я обновляю вопрос. можете ли вы помочь мне с обновленным вопросом?
2. Каков диапазон для основных чисел (например: 410-4000) и подмножества (например: 1-20). Это даст лучшее представление о том, на что устанавливать числа, поскольку, возможно, вам нужно изменить case_when(stri_length(split_out) => 3 на значение, равное или превышающее 3 символа.