2015-12-14 6 views
0

J'ai créé un data.frame qui contient mes mots et ses fréquences. Maintenant, je voudrais faire un findAssocs contre chaque ligne de mon cadre, mais je ne peux pas faire fonctionner mon code. Toute aide est appréciée.Comment appliquer findAssoc à chaque ligne de données.frame

Voici un exemple de mon data.frame term.df

term.df <- data.frame(word = names(v),freq=v)

word freq 
 
ounce 8917 
 
pack 6724 
 
count 4992 
 
organic 3696 
 
frozen 2534 
 
free 1728

J'ai créé un TermDocumentMatrix tdm et le code suivant fonctionne comme prévu.

findAssocs(tdm, 'frozen', 0.20)

Je voudrais ajouter la sortie de findAssocs comme une nouvelle colonne

Voici le code que j'ai essayé:

library(dplyr) 
 
library(tm) 
 
library(pbapply) 
 

 
#I would like to append all findings in a new column 
 

 
res <- merge(do.call(rbind.data.frame, pblapply(term.df, findAssocs(tdm, term.df$word , 0.18))), 
 
       term.df[, c("word")], by.x="list.q", by.y="word", all.x=TRUE)

EDIT: comme pour la sortie. La seule déclaration ci-dessus me procure quelque chose comme ça.

$yogurt 
 
    greek ellenos  fat chobani dannon fage yoplait nonfat wallaby 
 
    0.62 0.36 0.25 0.24 0.24 0.24 0.24 0.22 0.20

J'espérais, il serait possible d'ajouter une seule colonne à ma table originale (assoc) et de mettre les résultats sous forme de virgules nom séparés: tuples de valeur, mais je suis vraiment ouvert à idées

Répondre

1

Je pense une structure qui serait plus simple à manipuler serait une liste imbriquée:

lapply(seq_len(nrow(text.df)), function(i) { 
    list(word=text.df$word[i], 
     freq=text.df$freq[i], 
     assoc=findAssocs(tdm, as.character(text.df$word[i]), 0.7)[[1]]) 
}) 
# [[1]] 
# [[1]]$word 
# [1] "oil" 
# 
# [[1]]$freq 
# [1] 3 
# 
# [[1]]$assoc 
#  15.8  opec clearly  late trying  who winter analysts 
#  0.87  0.87  0.80  0.80  0.80  0.80  0.80  0.79 
#  said meeting  above emergency market  fixed  that prices 
#  0.78  0.77  0.76  0.75  0.75  0.73  0.73  0.72 
# agreement buyers 
#  0.71  0.70 
# 
# 
# [[2]] 
# [[2]]$word 
# [1] "opec" 
# 
# [[2]]$freq 
# [1] 2 
# 
# [[2]]$assoc 
# meeting emergency  oil  15.8 analysts  buyers  above 
#  0.88  0.87  0.87  0.85  0.85  0.83  0.82 
#  said ability  they prices. agreement  but clearly 
#  0.82  0.80  0.80  0.79  0.76  0.74  0.74 
# december. however,  late production  sell  trying  who 
#  0.74  0.74  0.74  0.74  0.74  0.74  0.74 
#  winter  quota  that through  bpd  market 
#  0.74  0.73  0.73  0.73  0.70  0.70 
# 
# 
# [[3]] 
# [[3]]$word 
# [1] "xyz" 
# 
# [[3]]$freq 
# [1] 1 
# 
# [[3]]$assoc 
# numeric(0) 

Dans mon expérience, ce sera plus facile à manipuler que une chaîne imbriquée parce que vous pouvez toujours accéder aux associations de mots pour chaque ligne de votre objet original text.df en accédant à l'élément correspondant dans la liste affichée.

Si vous voulez vraiment garder une structure de trame de données, alors vous pouvez assez facilement convertir la sortie findAssocs à une représentation de chaîne, par exemple en utilisant toJSON:

library(RJSONIO) 
text.df$assoc <- sapply(text.df$word, function(x) toJSON(findAssocs(tdm, x, 0.7)[[1]], collapse="")) 
text.df 
# word freq 
# 1 oil 3 
# 2 opec 2 
# 3 xyz 1 
#                                                                                                                  assoc 
# 1 { "15.8": 0.87,"opec": 0.87,"clearly": 0.8,"late": 0.8,"trying": 0.8,"who": 0.8,"winter": 0.8,"analysts": 0.79,"said": 0.78,"meeting": 0.77,"above": 0.76,"emergency": 0.75,"market": 0.75,"fixed": 0.73,"that": 0.73,"prices": 0.72,"agreement": 0.71,"buyers": 0.7 } 
# 2 { "meeting": 0.88,"emergency": 0.87,"oil": 0.87,"15.8": 0.85,"analysts": 0.85,"buyers": 0.83,"above": 0.82,"said": 0.82,"ability": 0.8,"they": 0.8,"prices.": 0.79,"agreement": 0.76,"but": 0.74,"clearly": 0.74,"december.": 0.74,"however,": 0.74,"late": 0.74,"production": 0.74,"sell": 0.74,"trying": 0.74,"who": 0.74,"winter": 0.74,"quota": 0.73,"that": 0.73,"through": 0.73,"bpd": 0.7,"market": 0.7 } 
# 3 [ ] 

données:

library(tm) 
data("crude") 
tdm <- TermDocumentMatrix(crude) 
(text.df <- data.frame(word=c("oil", "opec", "xyz"), freq=c(3, 2, 1), stringsAsFactors=FALSE)) 
# word freq 
# 1 oil 3 
# 2 opec 2 
# 3 xyz 1 
+0

juste Vous vous demandez comment faire cette visualisation avec la liste des termes associés? --https: //8d0e1890-a-62cb3a1a-s-sites.googlegroups.com/site/miningtwitter/basics/getting-data/files/GeneticsGenomicsTweetsGraph.pdf?attachauth = ANoY7cqWJiOTGtP9s2eFv6qRAplaA6aCx04rRAHlY4EAjm4bYDU7MwgaDOzrgesOVHwSEHgdP9qPXnQapfIEr6bMw9Ak9LeNFl86B0F3YfhEShd2_iPRFuDKZvjjo9nW4QGdsyGo9HOFzbf1B4VjFEjaY2OxGGXiDNzpT7kUHJQYXXxyrN1GM7Ou1SJusLdPLz-xeEQl2D453gkqesoW7fghDBGEYeXXvT7LR4y0sOhEK75D5gtjFe3Vq5IgTSLsivm_FoMcSAxaMIqFDkdtcg8JXyBtb4bqTg% 3D% 3D & attredirects = 0 – DirkLX

+0

@DirkLX Je ne suis pas sûr que je comprends ce que vous demandez, mais il semble que c'est une question différente de celle que vous avez demandé ici (peut-être que je comprends mal, cependant) . Pourriez-vous poster une nouvelle question pour que toute la communauté puisse vous aider? – josliber

+0

vous avez raison. Je ferai. Merci! – DirkLX