如何编辑 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)

唯一的问题是,如果匹配失败(未找到模式),则会返回整个字符串,这可能不是您想要的。如果你想提取你发现的东西,那么有几种技术使用 gregexprregmatches,或者 stringr::str_extract.