R中的几个函数专门处理公式右侧的变量的某些函数。例如s
中的mgcv
或strata
中的survival
。在我的例子中,我希望从模型矩阵中取出变量的特定函数并进行特殊处理。除了在列名称上使用grep
之外,我无法看到如何执行此操作(如下所示) - 如果公式中未使用f(.)
,这也不起作用。有没有人有更优雅的解决方案?我查看了survival
和mgcv
,但我发现代码很难遵循,并且对我的需求来说太过分了。感谢。
f <- function(x) {
# do stuff
return(x)
}
data <- data.frame(y = rnorm(10),
x1 = rnorm(10),
x2 = rnorm(10),
s = rnorm(10))
formula <- y ~ x1 + x2 + f(s)
mf <- model.frame(formula, data)
x <- model.matrix(formula, mf)
desired_x <- x[ , -grep("f\\(", colnames(x))]
desired_f <- x[ , grep("f\\(", colnames(x))]
输出:
> head(desired_x)
(Intercept) x1 x2
1 1 0.29864902 0.1474018
2 1 -0.03192798 -0.4424467
3 1 -0.83716557 1.0268295
4 1 -0.74094149 1.1094299
5 1 1.38706580 -0.2339486
6 1 -0.52925896 1.2866540
> desired_f
1 2 3 4 5 6
0.46751965 0.65939178 -1.35835634 -0.05322648 -0.09286254 1.05423067
7 8 9 10
-1.71971996 0.71743985 -0.65993305 -0.79821349