Как извлечь частичную строку на основе другого столбца строк? - PullRequest
0 голосов
/ 06 февраля 2019

Я преобразовываю вывод из системы планирования.Я хочу создать 2 новых столбца из одного исходного столбца.Первый нужный столбец содержит первые шесть символов из исходного столбца.Желаемый второй столбец должен иметь комбинацию пустых строк и частичных совпадений строк.Я начинающий.Ресурсы приветствуются, когда я делаю невежественные синтаксические ошибки.

Исходный файл данных выглядит так:

# A tibble: 6 x 2
  `Schedule Title` `Staff or Resource Name`                                
  <chr>            <chr>                                                   
1 Consultation     BIO210 (Bio stat); Carl; LSP143 (computer lab)          
2 Weekly           PHY111; (Physics I); Noah/Prof Stubbin                  
3 Weekly           CHM111 (Gen Chem); Ali/Prof Van Arman                   
4 Workshops        CHM111 Quant Skills Workshop, KAU104                    
5 Workshops        CPS111 Study Jam (Computer Science)                     
6 Workshops        CHM211 Organic Chem Study Tips from Q&SC Tutors, HARWOOD

Желаемый файл:

# A tibble: 6 x 3
  `Schedule Title` `Course` `WorkshopName`                            
  <chr>            <chr>  <chr>                                   
1 Consultation     BIO210                                      
2 Weekly           PHY111                                      
3 Weekly           CHM111                                     
4 Workshops        CHM111 Quant Skills Workshop                   
5 Workshops        CPS111 Study Jam                               
6 Workshops        CHM211 Organic Chem Study Tips from Q&SC Tutors

У меня нет проблем с использованием str_sub создать «Курс».

Однако я не смог успешно создать WorkshopName.Я попытался а) фильтрация по типу, а затем извлечение символов 8-конец.Я попытался б) извлечение символов 8-конец и затем заменить что-либо после , ; или \( с пустым текстом.Оба подхода (даже если они работали) являются лишь частичным решением.

#1. This works and creates the Course column
QSC$Course <- str_sub(QSC$Staff.or.Resource.Name, start = 1, end = 6)

#2. This does not work.  I was trying to filter by 'Type', then create WorkshopName for only those of Type: Workshop. I would still need to clean up the WorkshopNames to eliminate everything after a , ; or (.
QSC %>%
filter(str_detect(Type, 'Workshops') ) %>%
WorkshopName = str_sub('Staff or Resource Name', start = 8, end = -1)

#3. This also does not work.  I tried to extract characters 8-end, then replace anything after , ; or (.  
#I have not been able to successfully escape the character (. 
#I haven't even gotten to the part where I intended to filter and replace the strings with blanks for all but Type:Workshop.
QSC$WorkshopName <- str_sub(QSC$`Staff or Resource Name`, start = 8, end = -1)
QSC$WorkshopName <- str_split(QSC$WorkshopName,",", 1)
QSC$WorkshopName <- str_split(QSC$WorkshopName,";", 1)
QSC$WorkshopName <- str_split(QSC$WorkshopName,"\(", 1)
  1. Создает желаемый столбец «Курс».
  2. приводит к

    Error in QSC %>% WorkshopName = str_sub("Staff or Resource Name", start = 8, : could not find function "%>%<-"

  3. приводит к

    Error: '\(' is an unrecognized escape in character string starting ""\("

1 Ответ

0 голосов
/ 06 февраля 2019
QSC %>%
filter(str_detect(Type, 'Workshops') ) %>%
WorkshopName = str_sub('Staff or Resource Name', start = 8, end = -1)

Это терпит неудачу, потому что вам нужно использовать mutate для создания новой переменной с dyplr:

QSC %>%
filter(str_detect(Type, 'Workshops') ) %>%
mutate(WorkshopName = str_sub('Staff or Resource Name', start = 8, end = -1))

Более того, чтобы добиться того, что вы хотите в своем комментарии, выможно использовать ifelse

QSC %>%
mutate(WorkshopName = if_else(str_detect(Type, 'Workshops'), str_sub('Staff or Resource Name', start = 8, end = -1), NA))

Теперь:

QSC$WorkshopName <- str_split(QSC$WorkshopName,"\(", 1)

Сбой, потому что вам нужно дополнительное \, чтобы интерпретировать R (правильно:

QSC$WorkshopName <- str_split(QSC$WorkshopName,"\\(", 1)

Наконец,последний аргумент во всех трех str_split равен 1 ... Я думаю, что это не имеет смысла. Если вы читаете ?str_split

n: количество возвращаемых частей. По умолчанию (Inf) используются всевозможные позиции разделения

Так что, если вы поставите 1, он вернет всю строку, вам нужно 2 или более. Если вы хотите получить первую часть после разделения, вам нужно это, чтобы высохраните часть до (первого) разделения и отбросьте то, что следует после

str_split(QSC$WorkshopName, "\\(")[[1]][1]

Best

...