如何编辑 r 中数据框列的每个文本值?
How to edit each text value of a column of a data frame in r?
我正在使用 r 中的大型数据框,其中包含一列,其中包含许多推文的文本内容。每个值都以“RT @(转发的帐户):”开头,例如“RT @RosannaXia:如果您想探索我们星球的不同角落,这里有一些深海奇观......”。我需要更改此列中的每个值以仅包含帐户名称(“@RosannaXia”)。我怎么能做到这一点?我知道我可以使用 gsub 和正则表达式(后视和先行)来做到这一点,但是当我尝试以下先行代码时它没有做任何事情(或显示错误):
Unnested_rts$rt_user <- gsub("[a-z](?=:)", "", Unnested_rts$rt_user, perl=TRUE)
有更好的方法吗?我不确定出了什么问题,但我仍然是一个非常缺乏经验的编码员。任何帮助将不胜感激!
您可以提取从 @
到冒号 (:
) 的所有内容。
x <- "RT @RosannaXia: Here’s some deep ocean wonder in case you want to explore a different corner of our planet..."
sub('RT (@.*?):.*', '\1', x)
#[1] "@RosannaXia"
对于你的情况,应该是 -
Unnested_rts$rt_user <- sub('RT (@.*?):.*', '\1', Unnested_rts$rt_user)
几件事:
- 根据 twitter,句柄可以包含字母数字 (
[A-Za-z0-9]
) 和下划线,这需要在您的模式中;
- 您的模式需要捕获并保存它,并丢弃其他所有内容,因为我们并不总是知道如何匹配其他所有内容,我们将坚持匹配我们所知道的并使用
.*
任何一方。
gsub(".*(@[A-Za-z0-9_]+)(?=:).*", "\1", "RT @RosannaXia: Here’s some deep ocean wonder in case you want to explore a different corner of our planet...", perl=TRUE)
# [1] "@RosannaXia"
既然你想要整个专栏都这样,你可能只需要
gsub(".*(@[A-Za-z0-9_]+)(?=:).*", "\1", Unnested_rts$rt_user, perl=TRUE)
唯一的问题是,如果匹配失败(未找到模式),则会返回整个字符串,这可能不是您想要的。如果你想提取你发现的东西,那么有几种技术使用 gregexpr
和 regmatches
,或者 stringr::str_extract
.
我正在使用 r 中的大型数据框,其中包含一列,其中包含许多推文的文本内容。每个值都以“RT @(转发的帐户):”开头,例如“RT @RosannaXia:如果您想探索我们星球的不同角落,这里有一些深海奇观......”。我需要更改此列中的每个值以仅包含帐户名称(“@RosannaXia”)。我怎么能做到这一点?我知道我可以使用 gsub 和正则表达式(后视和先行)来做到这一点,但是当我尝试以下先行代码时它没有做任何事情(或显示错误):
Unnested_rts$rt_user <- gsub("[a-z](?=:)", "", Unnested_rts$rt_user, perl=TRUE)
有更好的方法吗?我不确定出了什么问题,但我仍然是一个非常缺乏经验的编码员。任何帮助将不胜感激!
您可以提取从 @
到冒号 (:
) 的所有内容。
x <- "RT @RosannaXia: Here’s some deep ocean wonder in case you want to explore a different corner of our planet..."
sub('RT (@.*?):.*', '\1', x)
#[1] "@RosannaXia"
对于你的情况,应该是 -
Unnested_rts$rt_user <- sub('RT (@.*?):.*', '\1', Unnested_rts$rt_user)
几件事:
- 根据 twitter,句柄可以包含字母数字 (
[A-Za-z0-9]
) 和下划线,这需要在您的模式中; - 您的模式需要捕获并保存它,并丢弃其他所有内容,因为我们并不总是知道如何匹配其他所有内容,我们将坚持匹配我们所知道的并使用
.*
任何一方。
gsub(".*(@[A-Za-z0-9_]+)(?=:).*", "\1", "RT @RosannaXia: Here’s some deep ocean wonder in case you want to explore a different corner of our planet...", perl=TRUE)
# [1] "@RosannaXia"
既然你想要整个专栏都这样,你可能只需要
gsub(".*(@[A-Za-z0-9_]+)(?=:).*", "\1", Unnested_rts$rt_user, perl=TRUE)
唯一的问题是,如果匹配失败(未找到模式),则会返回整个字符串,这可能不是您想要的。如果你想提取你发现的东西,那么有几种技术使用 gregexpr
和 regmatches
,或者 stringr::str_extract
.