【问题标题】:unlist keeping the same number of elements (vectorized)unlist 保持相同数量的元素(矢量化)
【发布时间】:2014-12-09 21:21:59
【问题描述】:

我正在尝试从一些推文中提取所有主题标签,并为每条推文获取一个包含所有主题标签的字符串。 我正在使用来自stringrstr_extract,所以我获得了一个字符向量列表。我的问题是我无法将其取消列出并保留相同数量的列表元素(即推文数量)。 示例:

这是长度为 3 的推文向量:

a <- "rt @ugh_toulouse: #mondial2014 : le top 5 des mannequins brésiliens http://www.ladepeche.fr/article/2014/06/01/1892121-mondial-2014-le-top-5-des-mannequins-bresiliens.html #brésil "
b <- "rt @30millionsdamis: beauté de la nature : 1 #baleine sauve un naufragé ; elles pourtant tellement menacées par l'homme... http://goo.gl/xqrqhd #instinctanimal "
c <- "rt @onlyshe31: elle siège toujours!!!!!!!  marseille. nouveau procès pour la députée - 01/06/2014 - ladépêche.fr http://www.ladepeche.fr/article/2014/06/01/1892035-marseille-nouveau-proces-pour-la-deputee.html #toulouse "
all <- c(a, b, c)

现在我使用str_extract_all 来提取主题标签:

ex <- str_extract_all(all, "#(.+?)[ |\n]")

如果我现在使用unlist,我会得到一个长度为 5 的向量:

undesired <- unlist(ex)
> undesired
[1] "#mondial2014 "    "#brésil "        
[3] "#baleine "        "#instinctanimal "
[5] "#toulouse " 

我想要的是如下所示。然而,这是非常低效的,因为它不是矢量化的,而且它需要永远(真的!)在一个小的推文数据帧上:

desired <- c()
for (i in 1:length(ex)){
  desired[i] <- paste(ex[[i]], collapse = " ")
}

> desired
[1] "#mondial2014  #brésil "    
[2] "#baleine  #instinctanimal "
[3] "#toulouse " 

救命!

【问题讨论】:

  • 您的正则表达式效率低下而且有点错误。 (你不应该有一个+ 修饰符一个? 修饰符,并且匹配. 很慢。)试试"#([[:alpha:]][[:alnum:]]*)"。 (但请仔细检查这是否适用于您的语言环境中的 unicode 字符。另请参阅stackoverflow.com/q/14823376/134830
  • 很好的建议。我最终在我的数据上使用了它data$hashtags &lt;- str_trim(str_replace_all(sapply(stri_extract_all_regex(data$texte_du_tweet, '#([[:alpha:]][[:alnum:]]*)'), paste, collapse=' '), "[^[:alnum:] ]", ""))

标签: r twitter vectorization stringr


【解决方案1】:

您可以使用stringi,这对于大型数据集可能更快

library(stringi)
sapply(stri_extract_all_regex(all, '#(.+?)[ |\n]'), paste, collapse=' ')
#[1] "#mondial2014  #brésil "     "#baleine  #instinctanimal "
#[3] "#toulouse " 

for 循环可以很快,如果你 preassign 输出的长度 desired

desired <- numeric(length(ex))
for (i in 1:length(ex)){
  desired[i] <- paste(ex[[i]], collapse = " ") 
}

或者您可以使用vapply,它比sapply 更快并且更安全(由@Richie Cotton 提供)

vapply(ex, toString, character(1))
#[1] "#mondial2014 , #brésil "     "#baleine , #instinctanimal "
#[3] "#toulouse "                 

或者按照@Ananda Mahto 的建议

 vapply(stri_extract_all_regex(all, '#(.+?)[ |\n]'),
              stri_flatten, character(1L), collapse = " ")

【讨论】:

  • 最后一部分我会被desired &lt;- vapply(ex, toString, character(1)) 诱惑。
  • sapply(stri_extract_all_regex(all, '#(.+?)[ |\n]'), paste, collapse=' ') 具有魅力。非常感谢你们。
  • @akrun,为什么不把所有的东西都串起来? vapply(stri_extract_all_regex(all, '#(.+?)[ |\n]'), stri_flatten, character(1L), collapse = " ")? :-)
猜你喜欢
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多