如何在 R 中拆分 "formula"
How to split a "formula" in R
我正在尝试用我在 R 编程方面的有限知识制作一个小型 R 程序包。我正在尝试使用以下参数:
formula=~a+b*X
其中 X 是向量,'a' 和 'b' 是函数调用中的常量。
我想知道的是,输入公式后,我想分别提取 (a,b)
和 X,并将它们用于函数调用内的其他数据操作。有没有办法在 R 中做到这一点?
非常感谢任何指导。
注意:为清楚起见编辑了我的问题
我正在寻找类似于 model.matrix() 输出的内容。上面提到的公式可以更一般化以适应 'n' 个变量,例如
~2+3*X +4*Y+...+2*Z
在输出中,我需要系数 (2 3 4 ...2) 作为向量,[1 X Y ... Z] 作为协变量矩阵。
问题并不完全清楚,所以我们假设问题是,给定一个使用标准公式语法的公式,我们如何解析变量名称(或在第二个答案中的变量名称和常量)给出输出包含它们的字符向量。
1) all.vars 试试这个:
fo <- a + b * X # input
all.vars(fo)
给予:
[1] "a" "b" "X"
2) strapplyc 我们也可以通过字符串操作来实现。在这种情况下,它还会解析出常量。
library(gsubfn)
fo <- ~ 25 + 35 * X # input
strapplyc(gsub(" ", "", format(fo)), "-?[0-9.]+|[a-zA-Z0-9._]+", simplify = unlist)
给予:
[1] "25" "35" "X"
注意:如果您要做的只是评估公式的 RHS 作为 R 表达式,那么它只是:
X <- 1:3
fo <- ~ 1 + 2 * X
eval(fo[[2]])
给予:
[1] 3 5 7
更新:修复并添加了第二个解决方案和注释。
一个调用是一个符号列表and/or其他调用及其元素可以通过正常的索引操作访问,例如
f <- ~a+bX
f[[1]]
#`~`
f[[2]]
#a + bX
f[[2]][[1]]
#`+`
f[[2]][[2]]
#a
但是请注意,在您的公式中 bX
是一个符号,您可能指的是 b * X
。
f <- ~a + b * X
然后 a
和 b
通常会存储在未计算的列表中。
vars <- call('list', f[[2]][[2]], f[[2]][[3]][[2]])
vars
#list(a, b)
和 vars
会在某个时候传递给 eval
。
我正在尝试用我在 R 编程方面的有限知识制作一个小型 R 程序包。我正在尝试使用以下参数:
formula=~a+b*X
其中 X 是向量,'a' 和 'b' 是函数调用中的常量。
我想知道的是,输入公式后,我想分别提取 (a,b)
和 X,并将它们用于函数调用内的其他数据操作。有没有办法在 R 中做到这一点?
非常感谢任何指导。
注意:为清楚起见编辑了我的问题
我正在寻找类似于 model.matrix() 输出的内容。上面提到的公式可以更一般化以适应 'n' 个变量,例如
~2+3*X +4*Y+...+2*Z
在输出中,我需要系数 (2 3 4 ...2) 作为向量,[1 X Y ... Z] 作为协变量矩阵。
问题并不完全清楚,所以我们假设问题是,给定一个使用标准公式语法的公式,我们如何解析变量名称(或在第二个答案中的变量名称和常量)给出输出包含它们的字符向量。
1) all.vars 试试这个:
fo <- a + b * X # input
all.vars(fo)
给予:
[1] "a" "b" "X"
2) strapplyc 我们也可以通过字符串操作来实现。在这种情况下,它还会解析出常量。
library(gsubfn)
fo <- ~ 25 + 35 * X # input
strapplyc(gsub(" ", "", format(fo)), "-?[0-9.]+|[a-zA-Z0-9._]+", simplify = unlist)
给予:
[1] "25" "35" "X"
注意:如果您要做的只是评估公式的 RHS 作为 R 表达式,那么它只是:
X <- 1:3
fo <- ~ 1 + 2 * X
eval(fo[[2]])
给予:
[1] 3 5 7
更新:修复并添加了第二个解决方案和注释。
一个调用是一个符号列表and/or其他调用及其元素可以通过正常的索引操作访问,例如
f <- ~a+bX
f[[1]]
#`~`
f[[2]]
#a + bX
f[[2]][[1]]
#`+`
f[[2]][[2]]
#a
但是请注意,在您的公式中 bX
是一个符号,您可能指的是 b * X
。
f <- ~a + b * X
然后 a
和 b
通常会存储在未计算的列表中。
vars <- call('list', f[[2]][[2]], f[[2]][[3]][[2]])
vars
#list(a, b)
和 vars
会在某个时候传递给 eval
。