在 R 中,如何修改给定字符串名称的列表中的数据框列
In R, how do I modify a dataframe column in a list given a string name
我是 R 的新手。感谢您的耐心等待。我正在使用调查包。
背景:我正在编写一个函数,循环遍历复杂调查中预测变量和结果变量(即svyglm(outcome~predictor)
)的组合,以输出粗略的流行率.对于每个 outcome/predictor 组合,我想首先重新调整调查设计对象中的预测变量,以确保输出比率全部 > 1。
具体问题:给定调查设计对象名称、列名称和参考水平作为字符串,我如何告诉 R 我要重新调整所述列。
prams16是调查设计对象的名称,包括9个项目的列表,variables是调查设计对象中的分析数据集(数据框),mrace是变量DF中的一列。
这些作品:
prams16$variables$mrace <- relevel(prams16$variables$mrace, ref="White")
prams16[["variables"]]["mrace"] <- relevel(prams16$variables$mrace, ref="White")
但是,当我尝试使用字符串构造对 prams16$variables$mrace
或 prams16[["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)
这里有一种使用表达式算法解决此问题的方法。我们的任务是构造和评估以下表达式:
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
我是 R 的新手。感谢您的耐心等待。我正在使用调查包。
背景:我正在编写一个函数,循环遍历复杂调查中预测变量和结果变量(即svyglm(outcome~predictor)
)的组合,以输出粗略的流行率.对于每个 outcome/predictor 组合,我想首先重新调整调查设计对象中的预测变量,以确保输出比率全部 > 1。
具体问题:给定调查设计对象名称、列名称和参考水平作为字符串,我如何告诉 R 我要重新调整所述列。
prams16是调查设计对象的名称,包括9个项目的列表,variables是调查设计对象中的分析数据集(数据框),mrace是变量DF中的一列。
这些作品:
prams16$variables$mrace <- relevel(prams16$variables$mrace, ref="White")
prams16[["variables"]]["mrace"] <- relevel(prams16$variables$mrace, ref="White")
但是,当我尝试使用字符串构造对 prams16$variables$mrace
或 prams16[["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)
这里有一种使用表达式算法解决此问题的方法。我们的任务是构造和评估以下表达式:
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