来自调查包的 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 ] &lt;- 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 中的动态变量名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中的For循环中创建动态变量名称

在 Qualtrics 调查中,如何使用 JavaScript 动态设置滑块的范围?

动态 Freemarker 变量名

动态生成的表单无法正常工作

Bash中的动态变量名称

根据 sys.tables 中的名称声明一个变量,然后在动态 SQL 中根据该变量删除表