假设我有一些看起来像这样的数据:
df1 = data.frame(id=c("A1","A2","A3","A4"),
variable=as.factor(c("black", "black", "blue", "no answer")),
weight=c(3,3,4,2))
我想创建一个考虑到权重的降价表。现在我正在做以下事情:
library(knitr)
kable(as.data.frame(table(df1$variable)/nrow(df1)), format = "markdown")
在没有考虑权重的情况下给出了相对频率。除了使用权重之外,我还希望以绝对频率向表中添加一列。
谢谢!
答案 0 :(得分:1)
您可以使用此解决方案:
d <- aggregate(weight~variable,df1,sum) # calculate occurences
d$freqs <- d$weight/sum(d$weight) # calculate freqs
kable(d)
输出结果为:
|variable | weight| freqs|
|:---------|------:|---------:|
|black | 6| 0.5000000|
|blue | 4| 0.3333333|
|no answer | 2| 0.1666667|
[<强>更新强>
或者,您可以使用dplyr
包:
library(dplyr)
df1 %>%
group_by(variable) %>%
summarise(abs.freqs=sum(weight)) %>%
mutate(freqs=abs.freqs/sum(df1$weight)) %>%
kable()
它的语法更加冗长,但每一步都是自我解释的(%&gt;%是一个管道运算符,它使用左侧的表达式作为右侧表达式的第一个参数)。 输出是:
|variable | abs.freqs| freqs|
|:---------|---------:|---------:|
|black | 6| 0.5000000|
|blue | 4| 0.3333333|
|no answer | 2| 0.1666667|