在 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>
我有一列包含来自 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>