计算R中数据框中列表中出现的单词数

时间:2018-02-13 18:19:29

标签: arrays r string count stringi

我正在研究R中的一个小程序,它允许我从数据框中的列表中计算出现次数。

因此,我按如下方式导入我的数据框和单词列表。

df <- read.csv("tweets.csv")
wordlist <- read.csv("wordlist.csv")

我的想法是使用一个“for”循环,它遍历wordlist中的所有单词,计算它们在df数据框中的出现次数,然后将该数字添加到现有的单词列表中。

for (id in wordlist) 
{
wordlist$frequency <- sum(stri_detect_fixed(df$text, wordlist$word))
}

显然这不起作用。相反,它将我的词汇表中所有单词的频率添加到词表数据框中的每个单词,如下所示:

id  word     freuquency
1   the      1290
2   answer   1290
3   is       1290
4   wrong    1290

我知道它必须对我的for循环中的运行变量做一些事情。任何帮助表示赞赏:)

2 个答案:

答案 0 :(得分:0)

我会清理推文df以将内容变为小写,删除停用词和标点符号等。(首先清理推文,否则你将会得到&#34; Dog&#34;以及&#34; dog& #34;作为两个不同的词。

    x <- c("Heute oft gelesen: Hörmann: «Lieber die Fair-Play-Medaille» als Platz eins t.co/w75t1O3zWQ t.co/fQJ2eUbGLf",
"Lokalsport: Wallbaum versteigert Olympia-Kalender t.co/uH5HnJTwUE",
"Die „politischen Spiele“ sind hiermit eröffnet: t.co/EWSnRmNHlw via @de_sputnik")
wordlist <- c("Olympia", "hiermit", "Die")

然后我会sapply tolower版本并按空格解析。然后我使用unlist将其展平,使其成为单个向量而不是列表,然后取消对其进行取消命名,以便更容易阅读。

wordvec <- unname(unlist(sapply(x, function(z) str_split(tolower(z), " "))))

 [1] "heute"                   "oft"                     "gelesen:"                "hörmann:"                "«lieber"                
 [6] "die"                     "fair-play-medaille»"     "als"                     "platz"                   "eins"                   
[11] "t.co/w75t1o3zwq" "t.co/fqj2eubglf" "lokalsport:"             "wallbaum"                "versteigert"            
[16] "olympia-kalender"        "t.co/uh5hnjtwue" "die"                     "\u0084politischen"       "spiele\u0093"           
[21] "sind"                    "hiermit"                 "eröffnet:"               "t.co/ewsnrmnhlw" "via"                    
[26] "@de_sputnik"  

我认为这仍然非常混乱。我会查找一些文字清理解决方案,例如删除特殊字符,或使用grepl或其他内容删除http内容。

要过滤列表以仅包含您的字词,请尝试:

wordvec[wordvec %in% tolower(wordlist)]
[1] "die"     "die"     "hiermit"

然后您可以使用table

table(wordvec[wordvec %in% tolower(wordlist)])

die hiermit 
  2       1 
如果你愿意的话,你可以反过来完成最后一部分,但是我会专注于清理文本以删除特殊字符,只是做一些文本清理。

答案 1 :(得分:0)

这是我如何使用sapply来做到这一点。该函数检查data是否包含3个连续的字母组合并计算计数。

library(tidyverse)
library(stringi)

1000个随机创建的长度为100个字母的字符串

data <- replicate(100, sample(letters, size = 1000, replace = TRUE))%>%
        data.frame()%>%
        unite("string" , colnames(.) , sep = "", remove = TRUE)%>%
        .$string

head(data)
[1] "uggwaevptdbhhnmvunkcgdssgmulvyxxhnavbxxotwvkvvlycjeftmjufymwzofrhepraqfjlfslynkvbyommaawrvaoscuytfws"
[2] "vftwusfmkzwougqqupeeelcyaefkcxmrqphajcnerfiitttizmpjucohkvsawwiqolkvuofnuarmkriojlnnuvkcreekirfdpsil"
[3] "kbtkrlogalroiulppghcosrpqnryldiuigtsfopsldmcrmnwcwxlhtukvzsujkhqnillzmgwytpneigogvnsxtjgzuuhbjpdvtab"
[4] "cuzqynmbidfwubiuozuhudfqpynnfmkplnyetxxfzvobafmkggiqncykhvmmdrexvxdvtkljppudeiykxsapvpxbbheikydcagey"
[5] "qktsojaevqdegrqunbganigcnvkuxbydepgevcwqqkyekezjddbzqvepodyugwloauxygzgxnwlrjzkyvuihqdfxptwrpsvsdpzf"
[6] "ssfsgxhkankqbrzborfnnvcvqjaykicocxuydzelnuyfljjrhytzgndrktzfglhsuimwjqvvvtvqjsdlnwcbhfdfbsbgdmvfyjef"  

参考检查

上的data
three_consec_letters = expand.grid(letters, letters, letters)%>%
                       unite("consec", colnames(.), sep = "", remove = TRUE)%>%
                       .$consec

head(three_consec_letters)
[1] "aaa" "baa" "caa" "daa" "eaa" "faa"

检查并汇总three_consec_l​​etters是否为冗长的字符串

counts = sapply(three_consec_letters, function(x) stri_detect_fixed(data, x)%>%sum())

<强>结果

head(counts)
aaa baa caa daa eaa faa 
  5   6   6   4   0   3 

希望这有帮助。