2016-02-22 62 views
1

这里还是比较新的R。我有微博的一列,我试图创建一个包含转推柄“RT @blahblah”,像这样的列:str_extract_all返回一个列表,但我想要一个矢量

Tweets       Retweetfrom 
RT @john I had a good day   RT @john 
RT @josh I had a bad day   RT @josh 

这是我的代码:

r$Retweetfrom <- str_extract_all(r$Tweets, "^RT[:space:][email protected][:graph:]+") 

这是给我的结果是好的,但新的列不是矢量,而是列表。当我尝试将其列入清单时,它会引发错误:

Error in `$<-.data.frame`(`*tmp*`, "Retweetfrom", value = c("@AlpineITW", "@AllScienceGlobe", : replacement has 1168 rows, data has 2306 

任何人都知道如何处理此问题?非常感谢。

回答

1

假设有一个在每个Tweets列(不是很强的假设)的行只是一个RT @user那么你可能只需要str_extract(这将vectorise中的字符串)不str_extract_all(可能每行返回多个结果)。即

r$Retweetfrom <- str_extract(r$Tweets, "^RT[:space:][email protected][:graph:]+") 

在这种情况下,你将首次提到RT @user,这可能是你想要的。

+0

啊,这是有道理谢谢!但是如果我试图提取推文中的所有提及呢?有时在一条推文中有不止一个提及。 –

+0

这是一个稍微不同的问题;你的正则表达式抓住了RT'd给出的那个人(并且我第一次错过了它),你在正则表达式中使用'^',所以你最多只能得到一个(我又坏了,错过了'+' ;你会得到他们全部)。如果你想捕获tweet中的所有'@ user'提到,不管他们是否执行了RT,那么你需要决定如何在'data.frame'中存储一个可变长度的列表。 –

+0

现在这变得更有意义了。非常感谢乔纳森! –

2

如果我们有兴趣在一个base R选项,sub将是有益的

r$Retweetfrom <- sub(".*\\b(RT\\[email protected][[:graph:]]+)\\s+.*", 
         "\\1", r$Tweets) 
r$Retweetfrom 
#[1] "RT @john" "RT @josh" 
相关问题