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

时间:2015-02-03 11:12:55

标签: r extract social-networking

我使用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”等)和hashtags(“#hashtag1”等)。

为此,我需要从“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("","")
)

如何从“文本”列中提取/复制此信息并将其写入新列?

1 个答案:

答案 0 :(得分:1)

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

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