Разбить вектор строк и вставить подмножество результирующих элементов в новый вектор - PullRequest
11 голосов
/ 18 июня 2011

Определить

z<- as.character(c("1_xx xx xxx_xxxx_12_sep.xls","2_xx xx xxx_xxxx_15_aug.xls"))

так, чтобы

> z
[1] "1_xx xx xxx_xxxx_12_sep.xls" "2_xx xx xxx_xxxx_15_aug.xls"

Я хотел создать вектор w , такой, что

> w
[1] "1_12_sep" "2_15_aug"

То естьразделите каждый элемент из z на _ , а затем соедините элементы 1,4,5, удалив из последнего .xls .

Я могу управлять разделенной частью, но не уверен, какую функцию предоставить, например что-то вроде "

w <- as.character(lapply(strsplit(z,"_"), function(x) ???))

Ответы [ 4 ]

8 голосов
/ 18 июня 2011

Используя немного магии в пакете stringr: я отдельно извлекаю левые и правые поля даты, объединяю их и, наконец, удаляю .xls в конце.

library(stringr)
l <- str_extract(z, "\\d+_")
r <- str_extract(z, "\\d+_\\w*\\.xls")
gsub(".xls", "", paste(l, r, sep=""))

[1] "1_12_sep" "2_15_aug"

str_extract это оболочка для некоторых базовых функций R. Я считаю, что ее проще использовать.

Редактировать Вот краткое объяснение того, что делает регулярное выражение:

  • \\d+ ищет одну или несколько цифр.Он экранирован, чтобы отличить его от обычного символа d.
  • \\w* ищет ноль или более буквенно-цифровых символов (слово).Опять же, он сбежал.
  • \\. ищет десятичную точку.Этого нужно избегать, потому что в противном случае десятичная точка означает любой отдельный символ.

В теории регулярное выражение должно быть достаточно гибким.Для ваших дат должны быть одинарные или двойные символы.

8 голосов
/ 18 июня 2011

Вы можете сделать это, используя комбинацию strsplit, substr и lapply:

y <- strsplit(z,"_",fixed=TRUE)
lapply(y,FUN=function(x){paste(x[1],x[4],substr(x[5],1,3),sep="_")})
6 голосов
/ 18 июня 2011

Один вызов gsub (и некоторая магия регулярных выражений, основанная на ответе @ Andrie) может сделать это.См. ?regexp для получения подробной информации о том, что я использовал в аргументах pattern и replacement (обратная ссылка).

gsub("^(\\d+_).*_(\\d+_\\w*).xls", "\\1\\2", z)
# [1] "1_12_sep" "2_15_aug"
2 голосов
/ 18 июня 2011

Альтернатива в том же ключе @ Joran's Answer такова:

foo <- function(x) {
    o <- paste(x[c(1,4,5)], collapse = "_")
    substr(o, 1, nchar(o) - 4) 
}

sapply(strsplit(z, "_"), foo)

Различия незначительные - я использую collapse = "_" и nchar(), но в остальном он похож.

Вы можете написать это как однострочник

sapply(strsplit(z, "_"), 
       function(x) {o <- paste(x[c(1,4,5)], 
                               collapse = "_"); substr(o, 1, nchar(o)-4)})

но написание пользовательской функции для применения приятнее.

...