2016-07-14 4 views
1

У меня есть вектор с условиями, за которыми может следовать ноль или более квалификаторов, начиная с «/». Первый элемент всегда должен быть термином.Вставить некоторые элементы смешанного вектора

mesh <- c("Animals", "/physiology" , "/metabolism*", 
      "Insects", "Arabidopsis", "/immunology") 

Я хотел бы присоединиться к спецификатор с последним слагаемым и получить новый вектор

Animals/physiology 
Animals/metabolism* 
Insects 
Arabidopsis/immunology 

ответ

4

Сделать идентификатор группы по grepl ИНГ для значений не начиная с /, разделить на этот идентификатор группы, то paste0:

unlist(by(mesh, cumsum(grepl("^[^/]",mesh)), FUN=function(x) paste0(x[1], x[-1]))) 
#      11      12      2      3 
# "Animals/physiology" "Animals/metabolism*"    "Insects" "Arabidopsis/immunology" 
0

Может думать ни о чем более элегантной, чем это:

mesh <- c("Animals", "/physiology" , "/metabolism*", 
     "Insects", "Arabidopsis", "/immunology") 

#gets "prefixes", assuming they all start with a letter: 
pre <- grep(pattern = "^[[:alpha:]]", x = mesh) 

#gives integer IDs for the prefix-suffix groupings 
id <- rep(1:length(pre), times = diff(c(pre,length(mesh) + 1))) 

#function that pastes the first term in vector to any remaining ones 
    #will just return first term if there are no others 
combine <- function(x) paste0(x[1], x[-1]) 

#groups mesh by id, then applies combine to each group 
results <- tapply(mesh, INDEX = id, FUN = combine) 

unlist(results) 
1

Другой вариант tapply

unlist(tapply(mesh, cumsum(grepl("^[^/]", mesh)), 
      FUN = function(x) paste0(x[1], x[-1])), use.names=FALSE) 
#[1] "Animals/physiology"  "Animals/metabolism*" "Insects"    "Arabidopsis/immunology" 
Смежные вопросы