在R中动态地子集测量设计对象

时间:2013-04-25 20:40:30

标签: r subset survey

我试图弄清楚如何动态地对调查设计对象进行子集化。我已经构造了我的循环来发送字符串,并且不知道如何删除引号,因此R将其作为调用读取。

我想像这样循环一下(尽管这显然会破坏,因为%4中的SUBSET_VARIABLE%需要是一个不是字符串的调用。:

design <- svydesign( ~1 , weight = ~wt , data = mtcars ) 

for( SUBSET_VARIABLE in c("gear","carb") ){

    design <- subset( design ,  SUBSET_VARIABLE %in% 4 )

    a <- svymean(~mpg, design)

}

如果可能的话,我想避免在粘贴函数中定义语句,而不是使用eval( parse ( text = statement ) ) )来执行它。另外,我想避免使用索引,因为我知道survey.design对象的子集方法执行其他任务(请参阅:getS3method("subset", "survey.design"))并且希望确保动态运行子集与使用完全等效循环中的子集函数。感谢您提供的任何帮助

马修

2 个答案:

答案 0 :(得分:5)

使用evalquote - 我认为这应该可以让您拥有所需的所有灵活性:

for( SUBSET_VARIABLE in c(quote(gear), quote(carb)) ){
    design <- subset( design ,  eval(SUBSET_VARIABLE) %in% 4 )

    a <- svymean(~mpg, design)
}

或者,如果您想将字符串作为输入,则可以使用get代替:

for( SUBSET_VARIABLE in c("gear", "carb") ){
    design <- subset( design ,  get(SUBSET_VARIABLE) %in% 4 )

    a <- svymean(~mpg, design)
}

答案 1 :(得分:1)

这是一个略有不同的例子,有两个解决方案,一个使用简单的循环,另一个使用lapply(速度更快)。我希望这个答案也可能有用。

# Load Package
library(survey)

# Load Data
data(api)

# create survey design
dclus1 <- svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)

# create object with all possible categories of variable dnum,
# which we will use to subset the survey design
groups <- unique(apiclus1$dnum)

# QUERIES

使用简单循环,将输出分配到不同的数据帧

for (i in groups) {
    temp <- svyby(~stype,
              ~dnum+cname,
              design = subset(dclus1, dnum == i),
              svytotal)
    assign(paste0("subgroup", i), temp)
    }

使用Lapply,将输出绑定到一个数据帧

tablefun <- function(i){svyby(~stype,
                                    ~dnum+cname,
                                    design = subset(dclus1, dnum == i),
                                    svytotal)}

results <- do.call(rbind, lapply(groups, tablefun))