找到变量向量的加权频率和 se
find weighted frequency & se's for vector of variables
我想找到我数据中所有变量的加权频率及其 SE。
df <- data.frame(sex = c('F', 'M', 'F', 'M', 'M', 'M', 'F', 'F'),
married = c(1,1,1,1,0,0,1,1),
pens = c(0, 1, 1, 1, 1, 1, 0, 0),
weight = c(1.12, 0.55, 1.1, 0.6, 0.23, 0.23, 0.66, 0.67))
design <- svydesign(ids=~1, data=df, weights=~weight)
获取一个变量的加权频率:
svymean(~interaction(married), design)
mean SE
interaction(married)0 0.089147 0.0717
interaction(married)1 0.910853 0.0717
我的实际数据集很大,我想运行一次对所有变量进行此操作。
vars <- c("sex","married","pens")
我试过了,但它抛出了一个错误。
svymean(~interaction(reformulate(vars)), design)
Error in unique.default(x, nmax = nmax) :
unique() applies only to vectors
我也可以这样做——但是 运行ning svytable 对我没有帮助,因为我需要 SE。
for(i in seq_along(vars)){
print(prop.table(svytable(bquote(~.(as.name(vars[i]))), design)))
}
编辑
我想 运行 svymean(~interaction(var), design) 分别在我的 df 中的每个变量上。因此,不必像这样多次 运行:
svymean(~interaction(married), design)
svymean(~interaction(sex), design)
svymean(~interaction(pen), design)
我希望能够为我的矢量名称列表 (vars) 中的每个变量循环执行此命令。
有什么建议吗!??
我们可以使用paste
来创建公式
out1 <- svymean(as.formula(paste0('~interaction(', toString(vars), ')')), design)
out1
# mean SE
#interaction(sex, married, pens)F.0.0 0.000000 0.0000
#interaction(sex, married, pens)M.0.0 0.000000 0.0000
#interaction(sex, married, pens)F.1.0 0.474806 0.2109
#interaction(sex, married, pens)M.1.0 0.000000 0.0000
#interaction(sex, married, pens)F.0.1 0.000000 0.0000
#interaction(sex, married, pens)M.0.1 0.089147 0.0717
#interaction(sex, married, pens)F.1.1 0.213178 0.1945
#interaction(sex, married, pens)M.1.1 0.222868 0.1567
手动输入测试
out2 <- svymean(~interaction(sex,married, pens), design)
identical(out1, out2)
#[1] TRUE
更新
要单独执行此操作,我们可以使用 lapply
outlst1 <- lapply(vars, function(x)
svymean(as.formula(paste0('~interaction(', x, ')')), design))
outlst1
#[[1]]
# mean SE
#interaction(sex)F 0.68798 0.1721
#interaction(sex)M 0.31202 0.1721
#[[2]]
# mean SE
#interaction(married)0 0.089147 0.0717
#interaction(married)1 0.910853 0.0717
#[[3]]
# mean SE
#interaction(pens)0 0.47481 0.2109
#interaction(pens)1 0.52519 0.2109
我想找到我数据中所有变量的加权频率及其 SE。
df <- data.frame(sex = c('F', 'M', 'F', 'M', 'M', 'M', 'F', 'F'),
married = c(1,1,1,1,0,0,1,1),
pens = c(0, 1, 1, 1, 1, 1, 0, 0),
weight = c(1.12, 0.55, 1.1, 0.6, 0.23, 0.23, 0.66, 0.67))
design <- svydesign(ids=~1, data=df, weights=~weight)
获取一个变量的加权频率:
svymean(~interaction(married), design)
mean SE
interaction(married)0 0.089147 0.0717
interaction(married)1 0.910853 0.0717
我的实际数据集很大,我想运行一次对所有变量进行此操作。
vars <- c("sex","married","pens")
我试过了,但它抛出了一个错误。
svymean(~interaction(reformulate(vars)), design)
Error in unique.default(x, nmax = nmax) :
unique() applies only to vectors
我也可以这样做——但是 运行ning svytable 对我没有帮助,因为我需要 SE。
for(i in seq_along(vars)){
print(prop.table(svytable(bquote(~.(as.name(vars[i]))), design)))
}
编辑
我想 运行 svymean(~interaction(var), design) 分别在我的 df 中的每个变量上。因此,不必像这样多次 运行:
svymean(~interaction(married), design)
svymean(~interaction(sex), design)
svymean(~interaction(pen), design)
我希望能够为我的矢量名称列表 (vars) 中的每个变量循环执行此命令。
有什么建议吗!??
我们可以使用paste
来创建公式
out1 <- svymean(as.formula(paste0('~interaction(', toString(vars), ')')), design)
out1
# mean SE
#interaction(sex, married, pens)F.0.0 0.000000 0.0000
#interaction(sex, married, pens)M.0.0 0.000000 0.0000
#interaction(sex, married, pens)F.1.0 0.474806 0.2109
#interaction(sex, married, pens)M.1.0 0.000000 0.0000
#interaction(sex, married, pens)F.0.1 0.000000 0.0000
#interaction(sex, married, pens)M.0.1 0.089147 0.0717
#interaction(sex, married, pens)F.1.1 0.213178 0.1945
#interaction(sex, married, pens)M.1.1 0.222868 0.1567
手动输入测试
out2 <- svymean(~interaction(sex,married, pens), design)
identical(out1, out2)
#[1] TRUE
更新
要单独执行此操作,我们可以使用 lapply
outlst1 <- lapply(vars, function(x)
svymean(as.formula(paste0('~interaction(', x, ')')), design))
outlst1
#[[1]]
# mean SE
#interaction(sex)F 0.68798 0.1721
#interaction(sex)M 0.31202 0.1721
#[[2]]
# mean SE
#interaction(married)0 0.089147 0.0717
#interaction(married)1 0.910853 0.0717
#[[3]]
# mean SE
#interaction(pens)0 0.47481 0.2109
#interaction(pens)1 0.52519 0.2109