2015-07-16 2 views
1

Предположим, у меня есть такие строки, как:strsplit целыми числами, в R

"0cGy-GCSF6hr-f-m5" 
    "100cGy-LPS12hr-m-m2" 
    "300cGy-NOTRT24hr-f-m2" 
    "0cGy-6h-m1" 

Это своего рода сложно, но то, что я хочу, чтобы извлечь из них:

"GCSF", "LSP", "NOTRT", "NOTRT" 

, что означает, если есть ни один из «GCSF», «LSP», «NOTRT», а затем возвращает «NOTRT». и целые числа до ч/ч

6, 12, 24, 6 

Я пытался некоторое время, но очень разочарован. У кого-то есть хорошие идеи?

+1

Вы имели в виду, что второй «NOTRT» в ожидаемом выходе? Если да, откуда это? – ulfelder

+0

Извините за путаницу. См. Обновленный. –

+0

'do.call ('rbind', strsplit (gsub ('. * \\ - ([AZ] *) (\\ d +) h. *', '\\ 1 \\ 2', s), '')) 'и заполните '' notrt – rawr

ответ

4

Вы имеете в виду что-то вроде этого?

library(stringi) 
library(magrittr) 

s <- c("0cGy-GCSF6hr-f-m5", "100cGy-LPS12hr-m-m2", 
    "300cGy-NOTRT24hr-f-m2", "0cGy-6h-m1") 

stri_extract_all_regex(s, "[A-Z]+(?=[0-9]+hr?-)") %>% 
    unlist() %>% 
    ifelse(is.na(.), "NOTRT", .) 

stri_extract_all_regex(s, "[0-9]+(?=hr?-)") %>% unlist() 
+0

Спасибо, это здорово! –

+0

Быстрый вопрос, что, если нет «h» или «hr», таких как «0cGy-LPS6-m1», и я хотел иметь номер 6? Спасибо –

+0

@DavidZ Используйте 'ifelse'. –

2

Вот версия с использованием «dplyr» и «stringr», который возвращает векторы вместо списков и помещает «NOTRT» в пустых слотах для кластеров символов и 6 в пустых слотах для чисел:

library(dplyr) 
library(stringr) 

letters <- s %>% 
    str_extract_all("[A-Z]+(?=[0-9]+hr?)") %>% 
    lapply(., function(x) {if (length(x)==0) {"NOTRT"} else {x} }) %>% 
    unlist(.) 

numbers <- s %>% 
    str_extract_all("[0-9]+(?=hr?)") %>% 
    lapply(., function(x) {if (length(x)==0) {"6"} else {x} }) %>% 
    as.numeric(unlist(.)) 

Использование данных на примере из комментариев на предыдущем ответе, приложенном ...

s <- c("0cGy-GCSF6hr-f-m5", "100cGy-LPS12hr-m-m2", "300cGy-NOTRT24hr-f-m2", "0cGy-6h-m1", "0cGy-LPS6-m1") 

... вот вывод, который производит:

> letters 
[1] "GCSF" "LPS" "NOTRT" "NOTRT" "NOTRT" 

> numbers 
[1] 6 12 24 6 6 
Смежные вопросы