我有一张桌子,例如:
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中。
答案 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
有更优雅的方式,但上面应该会让您了解如何继续进行。