我试图弄清楚如何动态地对调查设计对象进行子集化。我已经构造了我的循环来发送字符串,并且不知道如何删除引号,因此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")
)并且希望确保动态运行子集与使用完全等效循环中的子集函数。感谢您提供的任何帮助
马修
答案 0 :(得分:5)
使用eval
和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)
}
答案 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)
}
tablefun <- function(i){svyby(~stype,
~dnum+cname,
design = subset(dclus1, dnum == i),
svytotal)}
results <- do.call(rbind, lapply(groups, tablefun))