【问题标题】:Frequency tables with weighted data in RR中带有加权数据的频率表
【发布时间】:2021-11-02 02:13:29
【问题描述】:

我需要按年龄和婚姻状况计算个人的频率,所以通常我会使用:

    table(age, marital_status)

但是,在数据采样后,每个人的权重都不同。如何将其合并到我的频率表中?

【问题讨论】:

    标签: r weighted frequency-distribution


    【解决方案1】:

    您可以使用来自包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
    

    【讨论】:

    • 非常好,wtd.table 选项非常适合我。谢谢。
    【解决方案2】:

    为了完整起见,使用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 wt
    1 A 40
    2 B 60

    或者使用不那么繁琐的公式表示法:

    aggregate(wt ~ var, data = df, FUN = sum)
    

    var wt
    1 A 40
    2 B 60

    【讨论】:

      【解决方案3】:

      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 |              |                         |
      
      

      【讨论】:

        【解决方案4】:

        使用data.table 你可以这样做:

        # using the same data as Victorp
        setDT(df)[, .(n = sum(wt)), var] 
        
           var  n
        1:   A 40
        2:   B 60
        

        【讨论】:

          【解决方案5】:

          您还可以使用包 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 上
          【解决方案6】:

          使用包装重量和功能 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 
          

          【讨论】:

            猜你喜欢
            • 2017-02-28
            • 1970-01-01
            • 1970-01-01
            • 2021-06-27
            • 1970-01-01
            • 1970-01-01
            • 2016-12-09
            • 1970-01-01
            相关资源
            最近更新 更多