【发布时间】:2021-11-02 02:13:29
【问题描述】:
我需要按年龄和婚姻状况计算个人的频率,所以通常我会使用:
table(age, marital_status)
但是,在数据采样后,每个人的权重都不同。如何将其合并到我的频率表中?
【问题讨论】:
标签: r weighted frequency-distribution
我需要按年龄和婚姻状况计算个人的频率,所以通常我会使用:
table(age, marital_status)
但是,在数据采样后,每个人的权重都不同。如何将其合并到我的频率表中?
【问题讨论】:
标签: r weighted frequency-distribution
您可以使用来自包survey 的函数svytable,或来自rgrs 的wtd.table。
编辑: rgrs 现在称为 questionr:
df <- data.frame(var = c("A", "A", "B", "B"), wt = c(30, 10, 20, 40))
library(questionr)
wtd.table(x = df$var, weights = df$wt)
# A B
# 40 60
dplyr 也可以:
library(dplyr)
count(x = df, var, wt = wt)
# # A tibble: 2 x 2
# var n
# <fctr> <dbl>
# 1 A 40
# 2 B 60
【讨论】:
为了完整起见,使用base R:
df <- data.frame(var = c("A", "A", "B", "B"), wt = c(30, 10, 20, 40))
aggregate(x = list("wt" = df$wt), by = list("var" = df$var), FUN = sum)
var wt1 A 402 B 60
或者使用不那么繁琐的公式表示法:
aggregate(wt ~ var, data = df, FUN = sum)
var wt1 A 402 B 60
【讨论】:
expss 包中的另一个解决方案:
df <- data.frame(var = c("A", "A", "B", "B"), wt = c(30, 10, 20, 40))
library(expss)
fre(df$var, weight = df$wt)
| df$var | Count | Valid percent | Percent | Responses, % | Cumulative responses, % |
| ------ | ----- | ------------- | ------- | ------------ | ----------------------- |
| A | 40 | 40 | 40 | 40 | 40 |
| B | 60 | 60 | 60 | 60 | 100 |
| #Total | 100 | 100 | 100 | 100 | |
| <NA> | 0 | | 0 | | |
【讨论】:
使用data.table 你可以这样做:
# using the same data as Victorp
setDT(df)[, .(n = sum(wt)), var]
var n
1: A 40
2: B 60
【讨论】:
您还可以使用包 freqweights 中的 tablefreq:
df <- data.frame(var = c("A", "A", "B", "B"), wt = c(30, 10, 20, 40))
library(freqweights)
tablefreq(df, "var", "wt")
A tibble: 2 x 2
var freq
<fct> <dbl>
1 A 40
2 B 60
【讨论】:
freqweights怎么了?不再在 CRAN 上
使用包装重量和功能 wpct
require(weights)
df <- data.frame(var = c("A", "A", "B", "B"), wt = c(30, 10, 20, 40))
wpct(df$var, df$wt)
A B
0.4 0.6
【讨论】: