Как удалить частичные строки, которые совпадают в одном столбце в R? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть фрейм данных со столбцами, как показано ниже:

User  df_text
 A    Hi, how are you ?
 B    This is beautiful!
 C    Hello guys
 D    Originally posted by A Hi, how are you? I am doing good
 E    Whats going on ?
 F    Originally posted by B I am doing good Welcome

Я хочу удалить текст, который частично соответствует строкам в столбце df_text.Например, в приведенном выше коде пользователь D ответил пользователю A, поэтому у него есть строка «первоначально опубликовано ..».Мне нужно сохранить фактический текст пользователя D и избавиться от всех тех строк, которые «изначально размещены» вместе с ассоциированным пользователем и текстом.

Я не понимаю, как это сделать.Я попробовал следующий код:

df_text[!df_text %in% grep(paste0(df_text, collapse = "|"), df_text, value = T)]

Что я ожидаю получить:

User  df_text
 A    Hi, how are you ?
 B    This is beautiful!
 C    Hello guys
 D    I am doing good
 E    Whats going on ?
 F    Welcome

Можно ли получить вышеуказанные результаты?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

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

(?:[A-Z] {4})?(.+?$)\n[\s\S]*?\KOriginally posted by [A-Z] \1 

Объяснение

Поиск

  • (?:[A-Z] {4})? - соответствует первой части строки ( A ).
  • (.+?$) - группа захвата, на которую будет ссылаться \1, это текст A отправлено.
  • \n[\s\S]*? - следующая строка и сохраните выделение, пока не найдет Originally po....
  • \K - очищает весь выбор, поэтому, когда вы .replace() не удалите важные вещи.

Match

  • Originally posted by [A-Z]- Текст, который ссылается на сообщение A.
  • \1 - Текст A отправлен, поэтому вы можете удалить его из сообщения B.
  • - И, конечно, пробел, который будет удален (таким образом, окончательный текст не будет испорчен).

Алгоритм

Я понятия не имею, как перевести этоАлгоритм Построенияот m до R, но здесь это в любом случае:

    var rgx = /(?:[A-Z] {4})?(.+?$)\n[\s\S]*?\KOriginally posted by [A-Z] \1 /;
    while (str.match(rgx))
        str = str.replace(rgx, "");

Примечания:

  • Не забудьте использовать perl=TRUE
  • Для этого регулярного выражения требуется цикл, так какне может соответствовать "вложенным строкам" (см. пример Regex101 )
  • Обратите внимание, что в конце выражения есть пробел

Пример

Текст

User  df_text
 A    <b>Hi, how are you ?</b>
 B    This is beautiful!
 C    Heuwi
 D    Originally posted by C Heuwi Hellou
 E    Hello guys
 F    <s>Originally posted by A Hi, how are you ? </s><b>I am doing good</b>
 G    Whats going on ?
 H    Test2
 I    <s>Originally posted by B I am doing good </s>Welcome
 J    Originally posted by C Test2 Hellou

Первый запуск

User  df_text
 A    Hi, how are you ?
 B    This is beautiful!
 C    <b>Heuwi</b>
 D    <s>Originally posted by C Heuwi </s>Hellou
 E    Hello guys
 F    I am doing good
 G    Whats going on ?
 H    <b>Test2</b>
 I    Welcome
 J    <s>Originally posted by C Test2 </s>Hellou

Последний запуск

User  df_text
 A    Hi, how are you ?
 B    This is beautiful!
 C    Heuwi
 D    Hellou
 E    Hello guys
 F    I am doing good
 G    Whats going on ?
 H    Test2
 I    Welcome
 J    Hellou
0 голосов
/ 15 февраля 2019

Вы можете использовать gsub, чтобы заменить текст / шаблон ничем "", например:

df$df_text <- gsub("Originally posted by ","",df$df_text)

, где df - ваш фрейм данных со столбцами user,df_text

больше вы можете использовать для цикла

for(i in 2:nrow(df){

  df$df_text[i] <- gsub(paste0("Originally posted by ",
                               df$df_text[i-1]),"",df$df_text[i])

}

это должно дать вам желаемый результат, но он довольно медленный

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...