在 R 中编写一个函数来删除列中包含某些字符的文本?

Write a function in R that removes text that contains certain characters in column?

我有一列包含来自 Twitter 的文本,这些文本既是原始帖子又是 responses/replies 帐户。

df 示例(200 万行中的 2 行):

ID |              Tweet                                
1    @mcr_chick i wanna sleep.lol.
2    Someone burned a hole.

我想删除所有带有“@”且相应名称附加到“@”符号的推文。如您所见 - 一些推文在推文中没有@name - 所以我需要以某种方式仅按包含“@”或其他内容的 ID 进行分组。

期望的输出:

ID |              Tweet                   | Original_Tweet        | Reply_Tweet             
1    @mcr_chick i wanna sleep.lol.          NA                      i wanna sleep.lol.
2    Someone burned a hole.                 Someone burned a hole.

我正在使用子命令从文本中删除“@”,然后删除推文中的第一个单词,但我仍然需要按包含“@”的那些进行分组。

如有任何帮助,我们将不胜感激!

我们可以str_extract从字符串的开头(^)提取没有'@'字符的'Tweet'(因此第一行变为NA因为开头有一个 @)来创建 'Original_Tweet' 并使用 case_when 通过删除以“@”开头后跟字符的子字符串来创建 'Reply_tweet' 列不是 space 和任何 space (\s+)(默认情况下 case_when returns NA 中的 TRUE

library(dplyr)
library(stringr)
df1 %>% 
    mutate(Original_Tweet = str_extract(Tweet, "^[^@]+"), 
     Reply_tweet = case_when(str_detect(Tweet, "@") ~ 
           str_remove(Tweet, "^@[^ ]+\s+")))

-输出

 ID                         Tweet        Original_Tweet        Reply_tweet
1  1 @mcr_chick i wanna sleep.lol.                  <NA> i wanna sleep.lol.
2  2         Someone burned a hole Someone burned a hole               <NA>

数据

df1 <- structure(list(ID = 1:2, Tweet = c("@mcr_chick i wanna sleep.lol.", 
"Someone burned a hole")), class = "data.frame", row.names = c(NA, 
-2L))

与 akrun 的方法略有不同

library(tidyverse)
data <- tibble(id=c(1,2),
       tweet=c("@mcr_chick i wanna sleep.lol.",
               "Someone burned a hole."))

data %>%
  mutate(
    #original tweet
    original = ifelse(
        #look for twitter handle
      str_detect(tweet, "@\w+"), 
        # if found, NA
      NA,
        # otherwise, text in tweet column
      tweet),
    #reply tweet
    reply = ifelse(
        # look for twitter handle
      str_detect(tweet, "@\w+"),
        # if found, remove handle
        str_remove(tweet,"@\w+"),
        # otherwise NA
        NA),
    #clean up some whitespace
    reply = str_trim(reply)
    )

这个returns:

id    tweet               original         reply       
<dbl> <chr>               <chr>            <chr>       
1      @mcr_chick i wanna~ NA               i wanna sle~
2      Someone burned a h~ Someone burned ~ NA       

逻辑类似于@Anthony Schmidt 在此处的回答,但在基础 R 中。

transform(data, Original_Tweet = ifelse(grepl('@',tweet,fixed = TRUE),NA, tweet),
          reply_tweet = ifelse(grepl('@', tweet, fixed = TRUE), 
                        sub('@.*?\s+', '', tweet), NA))

#  id                         tweet         Original_Tweet        reply_tweet
#1  1 @mcr_chick i wanna sleep.lol.                   <NA> i wanna sleep.lol.
#2  2        Someone burned a hole. Someone burned a hole.               <NA>

这是使用定义的正则表达式模式 " ?@\w+ ?" 的替代方法,它基本上搜索以 @ 开头的所有字符串,直到该字符串的结尾:

然后我们使用一些 stringr 函数结合 ifelse 语句:

library(dplyr)
library(stringr)
tweet_pattern <- " ?@\w+ ?"

df %>% 
    mutate(Original_Tweet = str_replace(Tweet, tweet_pattern, NA_character_),
           Reply_Tweet = ifelse(str_detect(Tweet, tweet_pattern), 
                                str_remove(Tweet, tweet_pattern), 
                                NA_character_))

输出:

  ID                         Tweet         Original_Tweet        Reply_Tweet
1  1 @mcr_chick i wanna sleep.lol.                   <NA> i wanna sleep.lol.
2  2        Someone burned a hole. Someone burned a hole.               <NA>