2016-02-22 66 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" 
相關問題