我正在处理调查数据,其中包含针对多个问题(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
有什么想法吗?
答案 0 :(得分:2)
不是 plyr 答案,但这让我感到震惊,因为我可以使用 reshape2 包中的功能直接解决这个问题。
首先,melt
数据集,创建一个可以命名为x
的响应值列(y1
中的唯一值 - 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
答案 1 :(得分: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 )