【问题标题】:Table in r to be weightedr中的表要加权
【发布时间】:2021-01-21 10:32:07
【问题描述】:

我正在尝试运行交叉表/列联表,但需要通过加权变量对其进行加权。 这是一些示例数据。

set.seed(123)
sex <- sample(c("Male", "Female"), 100, replace = TRUE)
age <- sample(c("0-15", "16-29", "30-44", "45+"), 100, replace = TRUE)
wgt <- sample(c(1:10), 100, replace = TRUE)
df <- data.frame(age,sex, wgt)

我已经运行它来获得一个常规的交叉表

table(df$sex, df$age)

为了获得加权频率,我尝试了 Hmisc 包(如果你知道更好的包,请告诉我)

library(Hmisc)
wtd.table(df$sex, df$age, weights=df$wgt)
Error in match.arg(type) : 'arg' must be of length 1

我不确定我哪里出错了,但它没有运行,所以任何帮助都会很棒。 或者,如果您知道如何在另一个包中执行此操作,这可能更适合分析调查数据,那也很棒。非常感谢。

【问题讨论】:

  • 只是为了添加一个注释,wgt 变量可以有小数,所以它需要一个内置的加权函数。感谢任何使用 rep 功能回复的人

标签: r crosstab weighted contingency


【解决方案1】:

stats 中的 Base R 具有 xtabs 正是为了这个:

xtabs(wgt ~ age + sex, data=df) 

【讨论】:

    【解决方案2】:

    试试这个

    GDAtools::wtable(df$sex, df$age, w = df$wgt)
    

    输出

           0-15 16-29 30-44 45+ NA tot
    Female   56    73    60  76  0 265
    Male     76    99   106  90  0 371
    NA        0     0     0   0  0   0
    tot     132   172   166 166  0 636
    

    更新

    如果你不想安装整个包,这里有两个你需要的基本功能:

    wtabledichotom

    获取它们,您应该可以毫无问题地使用wtable

    【讨论】:

    • 只是一个简单的问题,是否可以将第三层放入其中。当我尝试这个时它不起作用 GDAtools::wtable(df$sex, df$age, df$VAR3, w = df$wgt) - 当我创建了第三个变量时
    • 我认为这行不通。每次只能交叉表两个变量。
    • 不用担心3级。我不能写另一个问题。我会编辑我的另一个,谢谢你在这里回答了这个问题。对你来说是一个上升。谢谢
    【解决方案3】:

    一个tidyverse解决方案使用你的数据相同的set.seed,uncount相当于@Rui的rep的权重。

    library(dplyr)
    library(tidyr)
    
    df %>%
       uncount(weights = .$wgt) %>% 
       select(-wgt) %>%
       table
    #>        sex
    #> age     Female Male
    #>   0-15      56   76
    #>   16-29     73   99
    #>   30-44     60  106
    #>   45+       76   90
    

    【讨论】:

    • 如果是这种情况,如果 wgt 变量值不是整数,它会起作用吗?抱歉,我应该创建一个带小数位的随机 wgt
    • 是的。我用wgt &lt;- runif(100, min = .5, max = 20) 进行了测试,效果很好
    【解决方案4】:

    一个解决方案是按权重重复data.frame的行,然后table结果。

    以下重复 data.frame 的行(仅相关列):

    df[rep(row.names(df), df$wgt), 1:2]
    

    并且可以用来获取列联表。

    table(df[rep(row.names(df), df$wgt), 1:2])
    #       sex
    #age     Female Male
    #  0-15      56   76
    #  16-29     73   99
    #  30-44     60  106
    #  45+       76   90
    

    【讨论】:

    • 谢谢,它是一个简洁的解决方案,但通常 wgt 变量会有小数。我猜 rep 函数不起作用,除非 wgt 是整数?
    • 这将与我的非整数权重一样工作
    • @Chuck P,它适用于测试数据,但不适用于包含 30k+ 行数据的文件。干杯,我会重写我的问题。我认为代表效率不高
    • @H.Cheung 答案中的包名有误,是小写的t:GDAtools。并在此更正后安装。
    • @H.Cheung 在我的测试中,GDAtools::wtable 分别比Chuck P's 和我的解决方案快 140 倍和 180 倍。 df 的权重在 3000 到 5000 之间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2018-07-31
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多