2016-11-18 32 views
3

即使该公式包含函数,是否可以从公式中提取响应变量?从公式中提取变量

x1 <- ~responsename 

as.character(x1[[2]]) 

x2 <- ~log(responsename) 

as.character(x2[[2]][[2]]) 

这两种方法都给出了所需的答案("responsename")。但有没有办法在的情况下自动获得相同的答案?

PS:假设公式总是~ responsename~ f(responsename),没有+

回答

2
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" 
3

您的术语是非标准的(=错误!)。

(通常)单个“响应变量”(又名“因变量”)位于代字号~的左侧。

代字号右边的(通常是)多个变量被称为“解释性”或“预测变量”或“独立”变量。

你的例子是没有响应变量的单边公式。

您可以使用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)

+0

你说的很对,公式通常用于表达统计模型。当然,'terms()'返回一个带有“response”属性的对象,它位于左侧。但是,这只是公式的一种用法。您可能有兴趣知道它们在R中有更广泛的用途,这是为了捕捉表达式及其环境。请参阅http://adv-r.had.co.nz/Expressions.html – AndrewMacDonald

+0

您是否试图说您对“响应变量”这个术语的使用以任何方式标准化? – user20637