将数据从文本复制到 R 中的新列

Copying data from text into new columns in R

我使用 Twitter API 编译了一个推文数据集。

数据集基本上如下所示:

Data <- data.frame(
  X = c(1,2),
  text = c("Hello @User1 #hashtag1, hello @User2 and @User3, #hashtag2", "Hello @User2 #hashtag3, hello @User1 and @User3, #hashtag4"),
  screenname = c("author1", "author2")
) 

现在我想创建一个 data.frame 用于社交网络分析。我想展示每个屏幕名称(在此示例中 "author1" 等)如何链接到用户(“@User1”等)和主题标签(“#hashtag1”等)。

为此,我需要 extract/copy 来自 "text" 列的用户和主题标签,并将它们写入新列。 data.frame 应如下所示:

Data <- data.frame(
  X = c(1,2),
  text = c("Hello @User1 #hashtag1, hello @User2 and @User3, #hashtag2", "Hello @User2 #hashtag3, hello @User1 and @User3, #hashtag4"),
  screenname = c("author1", "author2"),
  U1 = c("@User1", "@User2"),
  U2 = c("@User2", "@User1"),
  U3 = c("@User3", "@User3"),
  U4 = c("",""),
  U5 = c("",""),
  H1 = c("#hashtag1", "#hashtag3"),
  H2 = c("#hashtag2", "#hashtag4"),
  H3 = c("",""),
  H4 = c("",""),
  H5 = c("","")
)

如何 extract/copy 来自 "text" 列的信息并将其写入新列?

这是我使用 stringi 包的简单尝试。此方法将创建列的数量作为用户和 hashtags 中最长的字符串,因此这将适用于 any 提到的用户或 hashtags 数量。这也将非常有效,因为该解决方案主要是矢量化的。

library(stringi)
Users <- stri_extract_all(Data$text, regex = "@[A-Za-z0-9]+")
Data[paste0("U", seq_len(max(sapply(Users, length))))] <- stri_list2matrix(Users, byrow = TRUE)
Hash <- stri_extract_all(Data$text, regex = "#[A-Za-z0-9]+")
Data[paste0("H", seq_len(max(sapply(Hash, length))))] <- stri_list2matrix(Hash, byrow = TRUE)
Data
#   X                                                       text screenname     U1     U2     U3        H1        H2
# 1 1 Hello @User1 #hashtag1, hello @User2 and @User3, #hashtag2    author1 @User1 @User2 @User3 #hashtag1 #hashtag2
# 2 2 Hello @User2 #hashtag3, hello @User1 and @User3, #hashtag4    author2 @User2 @User1 @User3 #hashtag3 #hashtag4