文件R中的统计属性

时间:2015-02-03 03:01:15

标签: r statistics std text-mining

我有一张桌子,例如:

test_data <- data.frame(
  doc = c(1,1,2,2,2,3,3),
  word = c("person", "grand", "person", "moment", "bout", "person", "moment"),
   frenq= c(9,8,5,4,3,5,3))

我想为每个“单词”计算mean和std,并创建一个新表,例如。

    word   freq (number of docs)  mean    std 
 personn     19                3  6.33  2.309
  moment      7                2  2.33  2.081

主要问题是sdt,例如,“person”这个词是sd(c(9,5,5))但是“moment”这个词是sd(c(0,4,3) )。零是第一个数字,因为该单词不在doc 1中。

2 个答案:

答案 0 :(得分:2)

您可以尝试dplyr。通过&#34; doc&#34;和&#34; word&#34;的独特组合创建一个新数据集(&#34; d1&#34;); &#34; test_data&#34;的列(expand.grid(..))。加入&#34; d1&#34;用&#34; test_data&#34; (left_join),替换&#34; frenq&#34;中的NA值by&#34; 0&#34; (replace(frenq,..)),在按&#34; word&#34;分组后,使用mutate_each获取摘要统计信息。

library(dplyr)
d1 <- expand.grid(doc=unique(test_data$doc), word=unique(test_data$word))
res <- left_join(d1, test_data) %>%
                   mutate(frenq=replace(frenq, is.na(frenq), 0)) %>%
                   group_by(word) %>% 
                   summarise_each(funs(freq=sum,NumberOfdocs= sum(.!=0),
                         mean, std=sd), frenq)
  res
  #    word freq Numberofdocs     mean      std
  #1   bout    3            1 1.000000 1.732051
  #2  grand    8            1 2.666667 4.618802
  #3 moment    7            2 2.333333 2.081666
  #4 person   19            3 6.333333 2.309401

或者使用data.table中的方法使用类似的方法。转换&#34; data.frame&#34;到&#34; data.table&#34; (setDT),设置&#34; doc&#34;,&#34; word&#34;作为关键列(setkey),交叉连接&#34; doc&#34;和&#34;字&#34; (CJ(doc=...,)),指定&#39; 0&#39; for NA元素&#34; frenq&#34; (is.na(frenq), frenq:=0),并获取按&#34; word&#34;分组的摘要统计信息(list(freq=..))。

  library(data.table)
  setkey(setDT(test_data), doc, word)[CJ(doc=unique(doc), 
        word=unique(word))][is.na(frenq), frenq:=0][,
           list(freq=sum(frenq), Numberofdocs=sum(frenq!=0), 
                  mean=mean(frenq), std=sd(frenq)) , by = word]
   #    word freq Numberofdocs     mean      std
   #1:   bout    3            1 1.000000 1.732051
   #2:  grand    8            1 2.666667 4.618802
   #3: moment    7            2 2.333333 2.081666
   #4: person   19            3 6.333333 2.309401

答案 1 :(得分:0)

一种简单的方法是先获取数据中唯一单词的列表(d):

uw <- unique(d$word)

然后你可以迭代uw获取与单词(w)匹配的所有数据:

for (w in uw){
    numdoc <- max(d$doc[d$word==w])
    freqs <- d$freq[d$word==w]
    m <- mean(freqs)
    ## etc ...
}

我确信使用apply有更优雅的方式,但上面应该会让您了解如何继续进行。