【问题标题】:find weighted frequency & se's for vector of variables找到变量向量的加权频率和 se
【发布时间】:2020-11-06 21:20:56
【问题描述】:

我想找到我数据中所有变量的加权频率及其 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

我也可以这样做——但运行 svytable 对我没有帮助,因为我需要 SE。

for(i in  seq_along(vars)){
    print(prop.table(svytable(bquote(~.(as.name(vars[i]))), design)))
 }

编辑

我想分别对我的 df 中的每个变量运行 svymean(~interaction(var), design) 。所以不必像这样运行多次:

svymean(~interaction(married), design)
svymean(~interaction(sex), design)
svymean(~interaction(pen), design)

我希望能够为我的名称向量列表 (vars) 中的每个变量循环执行此命令。

有什么建议吗!??

【问题讨论】:

    标签: r dplyr survey


    【解决方案1】:

    我们可以使用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
    

    【讨论】:

    • 谢谢!这对于一个小数据集非常有效,但是这个命令已经运行了大约 10 分钟,我的 df 没有结果,有 200 个变量和 2000 个观察值。
    • @NewBee 有200个变量,交互,会有很多组合
    • 感谢您指出这一点——我在帖子中犯了一个错误,会更正它,我想分别对每个变量运行 svymean,而不是作为单个向量相互组合。跨度>
    • @NewBee 对不起,我以为你想在所有事情上进行交互,这就是它有问题的原因
    • @NewBee 你可以做lapply(vars, function(x) {svmean &lt;- svymean(as.formula(paste0('~interaction(', x, ')')), design); sytbl &lt;- svytable(as.formula(paste0('~interaction(', x, ')')), design); list(svmean, sytbl))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    相关资源
    最近更新 更多