Извлечение элементов между символом и пробелом - PullRequest
3 голосов
/ 31 марта 2012

Мне трудно извлечь элементы между / и black space.Я могу сделать это, когда у меня есть два символа, например, < и >, но пробел выбрасывает меня.Я хотел бы наиболее эффективный способ сделать это в базе R. Это будет применено к тысячам векторов.

Я хотел бы включить это:

x <- "This/DT is/VBZ a/DT short/JJ sentence/NN consisting/VBG of/IN some/DT nouns,/JJ verbs,/NNS and/CC adjectives./VBG"

Это:

 [1] "DT"  "VBZ" "DT"  "JJ"  "NN"  "VBG" "IN"  "DT"  "JJ"  "NNS" "CC"  "VBG"

РЕДАКТИРОВАТЬ:

Спасибо всем за ответы.Я иду на скорость, поэтому код Андрес выигрывает.Код Двина побеждает за самое короткое количество кода.Дирк твой был вторым самым быстрым.Решение для stringr было самым медленным (я полагал, что так и будет), и его не было в базе, но оно вполне понятно (что на самом деле является целью пакета stringr, я думаю, так как это, похоже, философия Хэдли с большинством вещей.1022 * Я ценю вашу помощь. Еще раз спасибо.

Я думал, что включу бенчмаркинг, так как это будет lapplied по нескольким тысячам векторов:

    test replications elapsed relative user.self sys.self
1 ANDRES        10000    1.06 1.000000      1.05        0
3   DIRK        10000    1.29 1.216981      1.20        0
2   DWIN        10000    1.56 1.471698      1.43        0
4 FLODEL        10000    8.46 7.981132      7.70        0

Ответы [ 4 ]

5 голосов
/ 01 апреля 2012

Аналогично, но немного более кратко:

#1- Separate the elements by the blank space

    y=unlist(strsplit(x,' '))

#2- extract just what you want from each element:

    sub('^.*/([^ ]+).*$','\\1',y)

Где начальный и конечный символы привязки ^ и $ соответственно, .* соответствует любому символу.[^ ]+ принимает непустые символы.\\1 это первый помеченный символ

3 голосов
/ 01 апреля 2012

Использовать шаблон регулярных выражений с косой чертой или пробел:

strsplit(x, "/|\\s" )
[[1]]
 [1] "This"        "DT"          "is"          "VBZ"         "a"           "DT"          "short"      
 [8] "JJ"          "sentence"    "NN"          "consisting"  "VBG"         "of"          "IN"         
[15] "some"        "DT"          "nouns,"      "JJ"          "verbs,"      "NNS"         "and"        
[22] "CC"          "adjectives." "VBG"   

Не достаточно внимательно прочитал вопрос. Этот результат можно использовать для извлечения четных элементов:

strsplit(x, "/|\\s")[[1]][seq(2, 24, by=2)]
 [1] "DT"  "VBZ" "DT"  "JJ"  "NN"  "VBG" "IN"  "DT"  "JJ"  "NNS" "CC"  "VBG"
2 голосов
/ 01 апреля 2012

Вот одна строка:

R> x <- paste("This/DT is/VBZ a/DT short/JJ sentence/NN consisting/VBG"
              "of/IN some/DT nouns,/JJ verbs,/NNS and/CC adjectives./VBG"
R> matrix(do.call(c, strsplit(gsub("[a-zA-Z.,]*/", " ", x), " ")), 
+         ncol=2, byrow=TRUE)[,2]
 [1] "DT"  "VBZ" "DT"  "JJ"  "NN"  "VBG" "IN"  "DT"  "JJ"  "NNS" "CC"  "VBG"
R> 

Ключ в том, чтобы избавиться от «текста перед косой чертой»:

R> gsub("[a-zA-Z.,]*/", " ", x)
[1] " DT  VBZ  DT  JJ  NN  VBG  IN  DT  JJ  NNS  CC  VBG"
R> 

, после чего это просто вопрос разделениястрока

R> strsplit(gsub("[a-zA-Z.,]*/", " ", x), " ")
[[1]]
 [1]  ""    "DT"  ""    "VBZ" ""    "DT"  ""    "JJ"  ""    "NN"
 [11] ""    "VBG" ""    "IN"  ""    "DT"  ""    "JJ"  ""    "NNS" 
 [21] ""    "CC"  ""    "VBG"

и фильтрация "".Вполне могут быть более компактные способы для последнего бита.R>

1 голос
/ 01 апреля 2012

Пакет stringr имеет приятные функции для работы со строками с очень интуитивно понятными именами.Здесь вы можете использовать str_extract_all для получения всех совпадений (включая начальный слеш), затем str_sub для удаления слешей:

str_extract_all(x, "/\\w*")
# [[1]]
#  [1] "/DT"  "/VBZ" "/DT"  "/JJ"  "/NN"  "/VBG" "/IN"  "/DT"  "/JJ"  "/NNS"
# [11] "/CC"  "/VBG"

str_sub(str_extract_all(x, "/\\w*")[[1]], start = 2)
#  [1] "DT"  "VBZ" "DT"  "JJ"  "NN"  "VBG" "IN"  "DT"  "JJ"  "NNS" "CC"  "VBG"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...