назначить строку при условии

#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 символа.