скопировать строки, соответствующие шаблону, из строки в информационном кадре и поместить в новый столбец в новом информационном кадре - PullRequest
0 голосов
/ 24 декабря 2018

Мне нужно найти все строки между определенными символами в строке в столбце 1 в 2-кадровом кадре в R. Затем мне нужно поместить их в новую таблицу или информационный кадр, в котором есть экземпляры в столбце 1 с тем же столбцом.2 значения, которые были в исходном кадре данных рядом со столбцом 1. Вот пример.Мне нужно взять все слова между xx ... xx в столбце 1 файла данных foo.df и поместить их в новую таблицу со столбцом 2, показывающим пользователей, которые были в соответствующей строке в файле foo.df:

Мы можем сделать фрейм данных следующим образом:

text <- c('hello xxthisxx is a xxtestxx of','we xxarexx very happy','you will xxwantxx to help') 
user <- c('person1','person2','person3') 
foo.df <- data.frame(text,user)

НО тогда я хочу скопировать слова между xx, чтобы конечный результат выглядел так:

 text      user
 this   person1
 test   person1
 are    person2
 want   person3

Ничего у меня нетпопробовал вроде работает.Спасибо.

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Tidyverse подход, используя lookahead и регулярное выражение lookbehid

library( tidyverse )
foo.df %>% 
  mutate( text = str_extract_all( text, '(?<=[\\s]xx).*?(?=xx[\\s])' ) ) %>%
  unnest() %>%
  select( text, user )

#   text    user
# 1 this person1
# 2 test person1
# 3  are person2
# 4 want person3
0 голосов
/ 26 декабря 2018

Вот вариант base R с regmatches/gregexpr

out <- stack(setNames(regmatches(foo.df$text, 
   gregexpr("(?<=xx)[^ ]+(?=xx)", foo.df$text, perl = TRUE)), foo.df$user))
names(out) <- names(foo.df)
out    
#  text    user
#1 this person1
#2 test person1
#3  are person2
#4 want person3
0 голосов
/ 24 декабря 2018

Вот идея использования пакета cSplit из splitstackshape для разделения и преобразования нашей таблицы данных в длинный формат.После этого мы фильтруем записи в формате xx...xx и, наконец, удаляем ведущий и конечный xx, то есть

library(splitstackshape)

cSplit(foo.df, 'text', ' ', 'long')[grepl('xx.*xx', text),][,text := gsub('xx(.*)xx', '\\1', text)][]
#   text    user
#1: this person1
#2: test person1
#3:  are person2
#4: want person3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...