来自调查包的 svydesign 中的动态变量名称
Posted
技术标签:
【中文标题】来自调查包的 svydesign 中的动态变量名称【英文标题】:Dynamic variable names in svydesign from survey package 【发布时间】:2022-01-22 22:54:12 【问题描述】:我想向使用调查包创建的survey.design 添加列,可以按以下方式完成:
library(survey)
data(api)
dclus1 <- svydesign(id = ~dnum, weights = ~pw, data = apiclus1, fpc = ~fpc)
dclus2 <- transform(dclus1,
api00_b = api00 + 1)
svymean(~ api00, design = dclus2)
#> mean SE
#> api00 644.17 23.542
svymean(~ api00_b, design = dclus2)
#> mean SE
#> api00_b 645.17 23.542
对于更复杂的任务,我需要从外部向量动态创建这些变量名。以下会产生错误,但我认为可以说明我想要实现的目标:
vars <- c("api00_a", "api00_b")
dclus2 <- transform(dclus1,
vars[[2]] = api00 + 1)
如何实现新列的动态名称?
【问题讨论】:
可以在创建svydesign
之前编辑数据框apiclus1
吗? apiclus1[ , vars ] <- apiclus1[ , "api00" ] + 1
.. 或 ***.com/a/16225175/1759499 ?
之前无法编辑apiclus1
(因为我需要使用调查设计dclus1
创建新列)。我确实尝试过使用 eval()
、 quote()
get()
和 assign()
的组合来做到这一点,但没有成功(但也许有办法)
lapply( c( "meals" , "ell" ) , function( w ) svymean( ~ newvar , update( dclus1 , newvar = get( w ) + 1 ) ) )
怎么样?
【参考方案1】:
这是使用purrr
的可能解决方案:
library(purrr)
vars <- c("api00_a", "api00_b")
transform_func <- function(data, vars)
transform(data, vars = api00 + 1)
map(vars, ~transform_func(dclus1, .))
这给了我们以下列表:
[[1]]
1 - level Cluster Sampling design
With (15) clusters.
update(`_data`, ...)
[[2]]
1 - level Cluster Sampling design
With (15) clusters.
update(`_data`, ...)
【讨论】:
在此解决方案中,创建了一个包含两个survey.design 对象的列表,每个对象都具有相同的新vars
列。我需要一个单一的survey.design,其中新列名为api00_b
(或外部字符向量中的任何其他名称)。
你能提供你预期的输出吗?我不完全确定你的意思
就像在 OP 示例中一样,dclus2
应该有一个名为 api00_b
的新列,但该列名称应该从外部向量创建(在 OP 中为 vars
)【参考方案2】:
我认为您不能在 R 中等号的左侧使用这样的向量。不过,您不必使用transform
,它调用survey:::update.survey.design
。您可以直接添加新变量:
dclus2 <- dclus1
dclus2$variables[ ,vars[[1]]] <- dclus2$variables[,"api00"] + 1
这与在转换为survey.design 对象之前创建新变量相同,只要您不使用任何调查函数来创建新变量。仅使用安东尼的评论:
apiclus2 <- apiclus1
apiclus2[ , vars[[1]]] <- apiclus2[ , "api00" ] + 1
dclus_prep_2 <- svydesign(id = ~dnum, weights = ~pw, data = apiclus2, fpc = ~fpc)
您可能更喜欢使用srvyr
,它允许您使用dplyr
的!!
和:=
进行编程:
library(srvyr)
dclus_srvyr_1 <- as_survey_design(.data = apiclus1,
ids = dnum,
weights = pw,
fpc = fpc)
dclus_srvyr_2 <- mutate(dclus_srvyr_1,
!!vars[[1]] := api00 + 1)
所有版本都有相同的结果:
lapply(list(dclus2, dclus_prep_2, dclus_srvyr_2),
function(design) svymean(~api00_a, design=design))
[[1]]
mean SE
api00_a 645.17 23.542
[[2]]
mean SE
api00_a 645.17 23.542
[[3]]
mean SE
api00_a 645.17 23.542
【讨论】:
以上是关于来自调查包的 svydesign 中的动态变量名称的主要内容,如果未能解决你的问题,请参考以下文章