【发布时间】:2017-04-24 18:36:48
【问题描述】:
如何从 R 中的以下公式中提取“mpg”?我知道先将公式转换为字符然后使用某种正则表达式会很有用。但我不知道是哪一个。
mpg ~ x1 + x2
【问题讨论】:
标签: r
如何从 R 中的以下公式中提取“mpg”?我知道先将公式转换为字符然后使用某种正则表达式会很有用。但我不知道是哪一个。
mpg ~ x1 + x2
【问题讨论】:
标签: r
我们可以使用all.vars
all.vars(form)[1]
#[1] "mpg"
或terms
as.character(attr(terms(form), "variables")[[2]])
#[1] "mpg"
或者另一种选择是
paste(form)[[2]]
#[1] "mpg"
在哪里
form <- mpg ~ x1 + x2
【讨论】:
as.character,as.character(form)[2]怎么样
所有给出的答案都适用于您的特定用例。但是,如果您希望在更广泛的意义上使用它,则需要注意一些警告。为了讨论这些,我们将定义一些公式
fm <- mpg ~ x1 + x2
fm_one <- ~ x1 + x2
fm_multi <- mpg + y1 ~ x1 + x2
all.vars 将返回公式中所有变量的字符向量。这是目前给出的选项中最快的。但是,它不区分等式左侧和右侧的变量。这是否可以接受取决于您的用例。
all.vars(fm)[1] # "mpg"
all.vars(fm_one)[1] # "x1" (this is a right hand side variable)
all.vars(fm_multi)[1] # "mpg" (missing other left hand side variables)
terms 方法 (as.character(attr(terms(fm), "variables"))) 将生成类似的向量,但变量名称从第二个位置开始(list 调用占用第一个元素)。它具有与all.vars 方法相同的缺点。
as.character(attr(terms(fm), "variables"))[2] # "mpg"
as.character(attr(terms(fm_one), "variables"))[2] # "x1"
as.character(attr(terms(fm_multi), "variables"))[2] # "mpg"
使用as.character 会生成长度为3 或2 的字符向量,具体取决于是否存在左侧。这至少有能力返回整个左侧,但它不会返回响应变量的字符向量。但是,它仍然存在无法区分左侧变量和右侧变量的缺点。
as.character(fm) # "~" "mpg" "x1" "x2"
as.character(fm_one) # "~" "x1" "x2"
as.character(fm_multi) # "~" "mpg" "y1" "x1" "x2"
deparse 方法比all.vars 慢一些(但仍以纳秒为单位),并且具有区分左侧和右侧的主要优点。
gsub(" ","",gsub("~.*", "", deparse(fm))) # "mpg"
gsub(" ","",gsub("~.*", "", deparse(fm_one))) # ""
gsub(" ","",gsub("~.*", "", deparse(fm_multi))) # "mpg+y1"
根据您的实际需要,您可能不需要保护单边或多变量公式。如果您在一个已知所有公式都是单变量和双面的系统中工作,all.vars 可能是您最好的选择。如果你不能确定,我建议使用deparse 方法。这至少可以确保您在查找响应变量时始终获得响应变量。
【讨论】:
这是一种使用正则表达式的方法
x = mpg ~ x1 + x2
gsub(" ","",gsub("~.*", "", deparse(x)))
#[1] "mpg"
【讨论】:
Reduce 调用可能是多余的。据我所知,这同样适用于仅使用gsub(" ","",sub("~.*", "", deparse(x)))
给定公式:
frm <- as.formula(mpg ~ x1 + x2)
可以简单地使用以下方法提取左侧的术语:
as.character(frm[[2]])
[1] "mpg"
【讨论】: