gpt4 book ai didi

r - 在公式/字符串中的任意数量的函数周围添加 "'

转载 作者:行者123 更新时间:2023-12-01 02:02:40 25 4
gpt4 key购买 nike

简单的请求:

我想采用类似于以下内容的公式/字符串:

"A ~ 1 + B + C + L(diff(B), -k:k) + L(diff(C), -k:k)"

并将它们更改为将函数视为字符,如下所示:

"A ~ 1 + B + C + `L(diff(B), -k:k)` + `L(diff(C), -k:k)`"

字符串中可以有任意数量的“L(diff(___), -____:____)”。

背景:

这样我就可以采用 dynlm 制作的输出模型,并使用仅依赖于“lm”对象的函数来运行它们。

# package
library(dynlm)
# data
A <- as.ts(rnorm(20, 10, 2))
B <- as.ts(A + rnorm(20, 6, 2))
C <- as.ts(rnorm(20, 3, 1))
# lags/leads
k <- 1

# dynlm model
dyn.mod <- dynlm(A ~ 1 + B + C + L(diff(B), -k:k) + L(diff(C), -k:k))

# capture the formula and data
dyn.mod.call <- gsub(" ", "", paste(deparse(dyn.mod$call$formula), collapse = "")) # just in case formula is too long
dyn.mod.model <- dyn.mod$model # the matrix that was created from the call formula

# Do the following
lm(dyn.mod.call, data = dyn.mod.model) # Will not run obviously,
lm(A ~ 1 + B + C + `L(diff(B), -k:k)` + `L(diff(C), -k:k)`, data = dyn.mod.model) # will run

# how do I change
dyn.mod.call
# [1] "A ~ 1 + B + C + L(diff(B), -k:k) + L(diff(C), -k:k)"

# to ad " ` " around each dynlm "L()" function so the process is not manual?

感谢您的帮助。

最佳答案

请注意,我们并不是真的想要替换所有函数调用,因为 + 是一个函数(甚至 ~ 也可以被视为一个函数),但我们只想只替换某些。假设我们要处理的唯一函数调用是L。根据要匹配的内容适当修改第二个if。显示的函数以递归方式工作。没有使用任何包。

enquote_L <- function(x) {
if (length(x) == 1) return(x)
if (x[[1]] == as.name("L")) return(as.name(format(x)))
replace(x, -1, lapply(x[-1], enquote_L))
}

s <- "A ~ 1 + B + C + L(diff(B), -k:k) + L(diff(C), -k:k)"
enquote_L(as.formula(s))
## A ~ 1 + B + C + `L(diff(B), -k:k)` + `L(diff(C), -k:k)`

已添加

如果有多种函数,并且 +~ 是唯一不被处理的函数,那么一种变体可能是替换第二个 if 与:

if (x[[1]] != as.name("+") && x[[1]] != as.name("~")) return(as.name(format(x)))

关于r - 在公式/字符串中的任意数量的函数周围添加 "',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43763775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com