我正在尝试在R中编写一个接受如下公式的函数:
y ~ 1 + sex + age + (1 | school) + (1 | school:section)
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法来提取这个公式的各种组件,以便在我的函数中使用?例如,我希望能够获得左侧,每个变量,随机效应变量以及它们如何嵌套等.
有没有比走公式解析树更简单的方法呢?
seb*_*n-c 10
如果你想要一个不需要正则表达式的解决方案,我建议你考虑一下terms
.
form <- y ~ 1 + sex + age + (1 | school) + (1 | school:section)
terms(form)
## y ~ 1 + sex + age + (1 | school) + (1 | school:section)
## attr(,"variables")
## list(y, sex, age, 1 | school, 1 | school:section)
## attr(,"factors")
## sex age 1 | school 1 | school:section
## y 0 0 0 0
## sex 1 0 0 0
## age 0 1 0 0
## 1 | school 0 0 1 0
## 1 | school:section 0 0 0 1
## attr(,"term.labels")
## [1] "sex" "age" "1 | school" "1 | school:section"
## attr(,"order")
## [1] 1 1 1 1
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 1
## attr(,".Environment")
## <environment: R_GlobalEnv>
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用attributes
以下方法从中提取属性
attributes(terms(form))$term.labels
## [1] "sex" "age" "1 | school" "1 | school:section"
Run Code Online (Sandbox Code Playgroud)
扩展@Ben Bolker的建议:
f1 <- formula(y ~ 1 + sex + age + (1 | school) + (1 | school:section))
Run Code Online (Sandbox Code Playgroud)
左侧(假设左侧有一个变量):
all.vars(terms(f1))[1] # character
Run Code Online (Sandbox Code Playgroud)
变量:
all.vars(delete.response(terms(f1))) # character
Run Code Online (Sandbox Code Playgroud)
随机效应:
lme4:::findbars(f1) # returns list of language items
Run Code Online (Sandbox Code Playgroud)
还有这个formula.tools
包,虽然它没有专门针对混合效果模型的方法:
library(formula.tools)
lhs(f1)
r1 <- rhs.vars(f1) # gives fixed and random effects as character
r1[grepl("\\|", r1)] # character vector of random effects
Run Code Online (Sandbox Code Playgroud)
也许是这样的:
x <- as.formula("y ~ 1 + sex + age + (1 | school) + (1 | school:section)")
x[[2]]
x[[3]][2]
Run Code Online (Sandbox Code Playgroud)
您也可以使用strsplit
如下所示:
strsplit(as.character(x[[3]][2]), "\\+")
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2129 次 |
最近记录: |