1

我是 R 新手。感谢您的耐心等待。我正在使用调查包。

背景:我正在编写一个函数,该函数通过复杂调查中的预测变量和结果变量(即svyglm(outcome~predictor))的组合循环输出粗略的患病率。对于每个结果/预测变量组合,我想首先重新调整调查设计对象中的预测变量,以确保输出比率均 > 1。

具体问题:给定调查设计对象名称、列名和参考级别作为字符串,我如何告诉 RI 想要重新调整所述列的级别。

prams16 是调查设计对象的名称,其中包括 9 个项目的列表,变量是调查设计对象内的分析数据集(数据框),mrace 是变量 DF 中的一列。

这些工作:

prams16$variables$mrace <- relevel(prams16$variables$mrace, ref="White")
prams16[["variables"]]["mrace"] <- relevel(prams16$variables$mrace, ref="White")

但是,当我尝试构造对字符串prams16$variables$mraceprams16[["variables"]]["mrace"]使用字符串的引用时,似乎没有任何效果。

谢谢!

编辑:请求可重现的问题示例。

myPredictor <- as.factor(c("Red","White","Black","Red","Green","Black","White","Black","Red","Green","Black"))
myOutcome <- c(1,0,1,0,1,0,1,0,1,0,1)
myDF <- tibble(myPredictor, myOutcome)
myOtherStuff <- c("etc","etc")
myObj <- list(myDF=myDF,myOtherStuff=myOtherStuff)


#These work...
myObj$myDF$myPredictor <- relevel(myObj$myDF$myPredictor, ref="White")
str(myObj$myDF$myPredictor) #"White" is now the referent level

myObj[["myDF"]]["myPredictor"] <- relevel(myObj$myDF$myPredictor, ref="Red")
str(myObj$myDF$myPredictor) #"Red" is now the referent level

#How to construct relevel assignment statement from strings?
anObj <- "myObj"
aPredictor <- "myPredictor"
aRef <- "Green"

#Produces error
as.name(paste0(anObj,"$myDF$",aPredictor)) <- relevel(as.name(paste0(anObj,"$myDF$",aPredictor)), ref=aRef)
4

1 回答 1

1

这是一种使用表达式算术解决此问题的方法。我们的任务是构建和评估以下表达式:

myObj$myDF[[aPredictor]] <- relevel( myObj$myDF[[aPredictor]], ref=aRef )

第 1 步:将字符串转换"myObj"为符号名称:

sObj <- rlang::sym(anObj)      # Option 1
sObj <- as.name(anObj)         # Option 2

第 2 步:构造表达式myObj$myDF[[aPredictor]]

e1 <- rlang::expr( (!!sObj)$myDF[[aPredictor]] )

在这里,我们!!用来告诉rlang::expr我们要替换sObj为存储在该变量中的任何符号。没有!!,表达式将是sObj$myDF[[aPredictor]],这不是我们想要的。

第三步:构造目标表达式:

e2 <- rlang::expr( !!e1 <- relevel(!!e1, ref=aRef) )

和以前一样,!!替换e1为存储在其中的任何表达式(即,我们在步骤 2 中构建的内容)。

第 4 步:评估表达式并检查结果:

eval.parent(e2)

## The column is now correctly releveled to Green
myObj$myDF$myPredictor
#   [1] Red   White Black Red   Green Black White Black Red   Green Black
#  Levels: Green Black Red White
于 2020-05-11T16:26:10.197 回答