2016-10-13 18 views
1

つぶやきに使用されるハッシュタグのデータセットがあります。各行は特定のツイートであり、各変数は各ツイートに使用される異なるハッシュタグであるため、いくつかの観測では多くの変数が空です。彼らは少数のhasthagsを持っているので。私の究極の目的は、3つの最も一般的なハッシュタグの同時発生を見ることですが、そのためにはまず、どのトゥイットがこれらのトップ3ハッシュタグを使用しているかを見たいと思います。一致する文字列のリストを見つける

V1 | V2 | V3 |  top3 
    nyc|  |  | nyc, cool, nyc2016 
    cool| nyc |  | nyc, cool, nyc2016 
    hello| cool | nyc | nyc, cool, nyc2016 
winter| nyc |  | nyc, cool, nyc2016 

したがって、この例では、トップ3のハッシュタグはNYCとクールではなく、ハローと冬だった:

私のデータセットには、次のようになります。各ハッシュタグは

df1<-sapply(df$V1, function(x) grepl(sprintf('\\b%s\\b', x), df$top3)) 

を行うことでTOP3間にあった場合

は、私が見てみました。しかし、それは時間がかかりすぎています。そして、私はV2とV3(これはループを行うことができますが、実行するにはさらに時間がかかるでしょう)のためにこれを行う必要があります。

提案がありますか?

+0

'sapply(df $ V1、function(x)x%in unlist(strsplit(df $ top3、"、 ")))'? – JasonAizkalns

答えて

3

を、私たちは安全top3があなたのデータセットで一意であると仮定することはできますか?その場合:

df <- read.table(
    textConnection(" V1 | V2 | V3 |  top3 
    nyc|  |  | nyc, cool, nyc2016 
    cool| nyc |  | nyc, cool, nyc2016 
    hello| cool | nyc | nyc, cool, nyc2016 
winter| nyc |  | nyc, cool, nyc2016"), 
    sep = "|", header = TRUE, stringsAsFactors = FALSE, strip.white = TRUE) 
library(dplyr) ; library(stringr) 
top <- str_split(df$top3[[1]], pattern = ", ")[[1]] 
is_in_top <- function(x) x %in% top 
mutate_each(df, funs(is_in_top), vars = V1:V3) 
+0

完璧に作業し、超高速!私の最初のアイデアよりもはるかに優れています。 –

1

私は、このような操作を行う前に、正規化または長い形式でデータを取得しようとします。私は自分のデータがもっと柔軟になると感じています。その結果、多くの単語がトップであったかカウントがまとめたものである

id  n_in_top3 
(int)  (dbl) 
1   1 
2   2 
3   2 
4   1 

:中

library(dplyr) 
library(tidyr) 


df <- data.frame(v1 = c('nyc','cool','hello','winter') 
       ,v2 = c(NA,'nyc','cool','nyc') 
       ,v3 = c(NA,NA,'nyc',NA) 
       ,stringsAsFactors = F) 
top3 <- c('nyc','cool','nyc2016') 

df %>% mutate(id = row_number()) %>% gather(n, word,-id) %>% 
    filter(!is.na(word)) %>% group_by(id) %>% 
    summarise(n_in_top3 = sum(ifelse(word %in% top3,1,0))) 

結果:おそらくコメントで言及したソリューションは、あまりにも動作しますが、私は私の解決策を共有したいですあなたのデータの各行について3単語リスト。

あなたはそれが列ごとにTRUE/FALSE値を持つようにしたい場合は次のようにします

df %>% mutate(id = row_number()) %>% gather(n, word,-id) %>% 
    filter(!is.na(word)) %>% group_by(id, n) %>% 
    summarise(n_in_top3 = (word %in% top3)) %>% 
    spread(n, n_in_top3) 

を与える:

id v1  v2  v3 
<int> <lgl> <lgl> <lgl> 
1  TRUE NA  NA 
2  TRUE TRUE NA 
3  FALSE TRUE TRUE 
4  FALSE TRUE NA 
+0

ありがとう!これはうまくいきましたが、使用された各タグを特定する必要がありましたが、カウントではありません。ご迷惑をおかけして申し訳ございません。しかし、本質的に、私が使った答えはあなたのものと同じです。 –

+0

私のアンサーを調整しました。もちろんそれは味の問題です。すべての道がローマにつながる。 – Wietze314

+0

うん、これはちょうど私が必要としていた、良い! –