2

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

我想遍历一些这样的(尽管这显然会中断,因为 SUBSET_VARIABLE %in% 4 需要是一个调用而不是一个字符串。:

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"),并希望确保动态运行子集完全等同于在循环外使用子集函数。感谢您的任何帮助,您可以提供

马修

4

2 回答 2

6

使用evaland quote- 我认为这应该为您提供所需的所有灵活性:

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)
}
于 2013-04-25T21:38:49.663 回答
2

这是一个略有不同的示例,有两种解决方案,一种使用简单的 Loop,另一种使用 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))
于 2015-08-31T11:26:10.947 回答