首页 文章

加权表数据框与plyr

提问于
浏览
1

我正在使用包含多个问题(y1,y2,y3,...)的整数值响应和分配给每个受访者的加权计数的调查数据,如下所示:

foo <- data.frame(wcount = c(10, 1, 2, 3),        # weighted counts
                  y1 = sample(1:5, 4, replace=T), # numeric responses
                  y2 = sample(1:5, 4, replace=T), #
                  y3 = sample(1:5, 4, replace=T)) #
>foo
  wcount y1 y2 y3
1     10  5  5  5
2      1  1  4  4
3      2  1  2  5
4      3  2  5  3

我想将其转换为加权表的合并数据框版本,第一列表示响应值,接下来的3列表示加权计数 . 这可以通过列明确使用:

library(Hmisc)
ty1 <- wtd.table(foo$y1, foo$wcount)
ty2 <- wtd.table(foo$y2, foo$wcount)
ty3 <- wtd.table(foo$y3, foo$wcount)

bar <- merge(ty1, ty2, all=T, by="x")
bar <- merge(bar, ty3, all=T, by="x")

names(bar) <- c("x", "ty1", "ty2", "ty3")
bar[is.na(bar)]<-0
>bar
  x ty1 ty2 ty3
1 1   3   0   0
2 2   3   2   0
3 3   0   0   3
4 4   0   1   1
5 5  10  13  12

我怀疑有一种方法可以使用plyr和numcolwise或ddply自动执行此操作 . 例如,以下内容很接近,但我不确定完成这项工作还需要什么:

library(plyr)
bar2 <- numcolwise(wtd.table)(foo[c("y1","y2","y3")], foo$wcount)
>bar2
        y1       y2       y3
1  1, 2, 5  2, 4, 5  3, 4, 5
2 3, 3, 10 2, 1, 13 3, 1, 12

有什么想法吗?

2 回答

  • 0

    不是 plyr 答案,但这让我感到震惊,因为我可以使用软件包 reshape2 中的函数直接解决重塑/聚合问题 .

    首先, melt 数据集,使得响应值的列可以命名为 xy1 中的唯一值 - y3 ) .

    library(reshape2)
    dat2 = melt(foo, id.var = "wcount", value.name = "x")
    

    现在可以使用_2353600_将 sum 作为聚合函数强制转换回来 . 对于 x 的每个值,这将 y1 - y3 作为具有 wcount 之和的列 .

    # Cast back wide using the values within y1-y3 as response values
        # and filling with the sum of "wcount"
    dcast(dat2, x ~ variable, value.var = "wcount", fun = sum)
    

    给予

    x y1 y2 y3
    1 1  3  0  0
    2 2  3  2  0
    3 3  0  0  3
    4 4  0  1  1
    5 5 10 13 12
    
  • 2

    您正在描述使用重复权重的调查数据集 . 有很多很多例子,请参阅http://asdfree.com/,但对于recs,请执行以下操作:

    library(survey)
    
    x <- read.csv( "http://www.eia.gov/consumption/residential/data/2009/csv/recs2009_public.csv" )
    rw <- read.csv( "http://www.eia.gov/consumption/residential/data/2009/csv/recs2009_public_repweights.csv" )
    y <- merge( x , rw )
    
    # create a replicate-weighted survey design object
    z <- svrepdesign( data = y , weights = ~NWEIGHT , repweights = "brr_weight_[0-9]" )
    
    # now run all of your analyses on the object `z` ..
    # see the `survey` package homepage for details
    
    # distribution
    svymean( ~ factor( BASEHEAT ) , z )
    
    # mean
    svymean( ~ TOTHSQFT , z )
    

相关问题