是否有一种方法可以从公式中提取响应变量,即使该公式包含函数?
x1 <- ~responsename
as.character(x1[[2]])
x2 <- ~log(responsename)
as.character(x2[[2]][[2]])
这两种方法都可以得到所需的答案(
"responsename"
)。但有没有一种自动获得相同答案的方法呢?注:假设公式始终为
~ responsename
或~ f(responsename)
,不包含+
等其他内容。是否有一种方法可以从公式中提取响应变量,即使该公式包含函数?
x1 <- ~responsename
as.character(x1[[2]])
x2 <- ~log(responsename)
as.character(x2[[2]][[2]])
"responsename"
)。但有没有一种自动获得相同答案的方法呢?~ responsename
或~ f(responsename)
,不包含+
等其他内容。all.vars()获取变量名称; @Miff,all.names()
还返回函数名称。
我猜,在有响应变量的情况下,它通常会首先出现,因此您可以使用all.vars(formula)[1]
,但在(像您的示例一样)没有响应的单向公式中,这将给出第一个解释变量。
更好的方法是使用attr(terms(formula),"response")
来确定响应变量。
f <- y ~ x1 + x2
all.vars(f)[attr(terms(f), "response")]
# [1] "y"
f <- y ~ sin(x1) + cos(x2)
all.vars(f)[attr(terms(f), "response")]
# [1] "y"
f <- ~ x1 + x2
all.vars(f)[attr(terms(f), "response")]
# character(0)
f <- log(y) ~ x1 + x2
all.vars(f)[attr(terms(f), "response")]
# [1] "y"
如果你确实想要(最后指定的)解释变量,那么你可以使用tail(all.vars(formula),1)
。
tail(all.names(x1),1)
tail(all.names(x2),1)
#[1] "responsename"
tail(all.names(x1),1)
#[1] "responsename"
tail(all.names(~sin(responsename)),1)
#[1] "responsename"
tail(all.names(~(responsename)^2),1)
#[1] "responsename"
terms()
返回一个带有“response”属性的对象,该属性位于左侧。但是,这只是公式的一种用法。你可能会感兴趣地知道,在R中它们有更广泛的用途,即捕获表达式及其环境。例如,请参见http://adv-r.had.co.nz/Expressions.html。 - AndrewMacDonald