有没有办法从公式中提取响应变量,即使该公式包含函数?
x1 <- ~responsename
as.character(x1[[2]])
x2 <- ~log(responsename)
as.character(x2[[2]][[2]])
这两种方法都给出了期望的答案("responsename"
)。但有没有办法在 情况下自动获得相同的答案?
ps:假设公式始终为~ responsename
或~ f(responsename)
,没有+
等。
答案 0 :(得分:3)
您的术语是非标准的(=错误!)。
(通常)单个&#34;响应变量&#34; (又名&#34;因变量&#34;)位于代字号~
的左侧。
波浪号右侧的(通常)多个变量称为&#34;解释&#34;或&#34;预测者&#34;或者&#34;独立的&#34;变量
您的示例是单侧公式,没有响应变量。
您可以使用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)
答案 1 :(得分:2)
tail(all.names(x1),1)
似乎做你想做的事。 e.g。
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"