2014-10-03 38 views
1

我正在处理由多个问题(y1,y2,y3,...)的整数值响应和分配给每个应答者的加权计数组成的调查数据,如下所示:加权表格数据框与plyr

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 

有什么想法?

+0

嗨,你正在使用什么调查?这看起来像多重填补,需要'mitools' +'survey'包来获得正确的置信区间。 – 2014-10-03 21:12:23

+0

我正在与环境影响评估等美国住宅能源消费调查(RECS)合作。很高兴看到有一个关于一切的包,谢谢参考! – Bryan 2014-10-04 00:38:42

+0

这只是一个基于复制的调查。你试图重新发明轮子......你将有一个更容易的时间[复制他们的官方方法](http://www.eia.gov/consumption/residential/methodology/2009/pdf/using-microdata- 022613.pdf)如果您使用调查软件包。 :) – 2014-10-04 04:17:41

回答

1

不是plyr的答案,但是这给我的印象重塑/聚合,可以直截了当地用从包reshape2功能来解决问题。

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

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

现在,这可以与广投dcast回,使用sum作为聚合功能。这将y1 - y3作为列,总计为wcount,每个值为x

# 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 
+0

这很好,谢谢!我一直在使用融化,但我是一个演员新手,所以这是非常有帮助的。出于学习目的,我仍然有兴趣了解是否/如何使用ddply完成这项工作,如果没有,为什么不呢。 – Bryan 2014-10-03 20:21:55

0

你所描述的是使用重复权的一项调查数据集。看到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) 
+0

谢谢你的例子! FWIW,我的最终目标不是找到具有CI的汇总统计数据,而是使用加权直方图和加权经验cdf图格式来探索几个连续响应(例如温度设置)的分布,该图不支持权重(除了密度图),所以我不得不重新格式化数据以显示我想要的内容。调查提供了这些功能中的一部分,但我更喜欢多格调节功能来绘制格子。将需要花一些时间玩调查,看看他们是否可以一起工作。 – Bryan 2014-10-04 13:59:03