R公式:将所有变量包装在一个转换中
我有一个公式,在左侧和右侧有任意数量的变量:
a + b * c ~ d + e
此公式可以包含各种运算符,例如+或*。我想将公式的每个变量包装在一个转换中。例如,如果我的转换被称为Factor,那么上面的公式变为:
Factor(a) + Factor(b) * Factor(c) ~ Factor(d) + Factor(e)
请注意,它保留了相同的符号。
回答
1) rrapply我们可以使用rrapply递归遍历公式并用 包围每个作为句法名称的节点Factor(...)。或者,我们可以使用is.word <- function(x) grepl("^w+$", x)来检查仅包含单词字符的名称。
library(rrapply)
fo <- a + b * c ~ d + e
is.word <- function(x) make.names(x) == x
insert.Factor <- function(x) substitute(Factor(x), list(x = x))
rrapply(fo, is.word, insert.Factor)
## Factor(a) + Factor(b) * Factor(c) ~ Factor(d) + Factor(e)
如果我们可以有这样的公式
fo2 <- a + b * c ~ I(d) + e
我们想要 I(Factor(d)) 而不是 Factor(I)(Factor(d)) 然后将其用于is.word:
is.word <- function(x) make.names(x) == x && format(x) %in% all.vars(fo2)
2) gsub 转换为字符串,执行替换并转换回来。输入,fo,在上面定义。
formula(gsub("(w+)", "Factor(1)", format(fo)), environment(fo))
## Factor(a) + Factor(b) * Factor(c) ~ Factor(d) + Factor(e)
3) 转换数据框如果这些变量将从数据框 DF 中获得,那么我们可以转换它的列并保持公式不变。
DF[] <- lapply(DF, Factor)