从公式中提取变量

3

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

x1 <- ~responsename

as.character(x1[[2]])

x2 <- ~log(responsename)

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

这两种方法都可以得到所需的答案("responsename")。但有没有一种自动获得相同答案的方法呢?
注:假设公式始终为~ responsename~ f(responsename),不包含+等其他内容。
2个回答

4
您的术语非标准(=错误!)。
(通常)单个“响应变量”(也称为“因变量”)位于波浪线~的左侧。
右侧的(通常为多个)变量被称为“解释性”或“预测性”或“独立”变量。
您的示例是没有响应变量的单向公式。
您可以使用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)

你说得很对,公式通常用于表达统计模型。当然,terms()返回一个带有“response”属性的对象,该属性位于左侧。但是,这只是公式的一种用法。你可能会感兴趣地知道,在R中它们有更广泛的用途,即捕获表达式及其环境。例如,请参见http://adv-r.had.co.nz/Expressions.html。 - AndrewMacDonald
你是在说你对“响应变量”这个术语的使用是标准的吗? - user20637

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接