gpt4 book ai didi

r - 从数据框中提取公式中的变量

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

我有一个包含一些术语的公式和一个包含所有这些术语和更多术语的数据框(早期 model.frame() 调用的输出)。我想要模型框架的子集仅包含公式中出现的变量。

ff <- log(Reaction) ~ log(1+Days) + x + y
fr <- data.frame(`log(Reaction)`=1:4,
`log(1+Days)`=1:4,
x=1:4,
y=1:4,
z=1:4,
check.names=FALSE)

所需的结果是 fr 减去 z 列(fr[,1:4] 是作弊 - 我需要一个编程解决方案...)

一些不起作用的策略:

fr[all.vars(ff)]
## Error in `[.data.frame`(fr, all.vars(ff)) : undefined columns selected

(因为 all.vars() 获取 "Reaction",而不是 log("Reaction"))

stripwhite <- function(x) gsub("(^ +| +$)","",x)
vars <- stripwhite(unlist(strsplit(as.character(ff)[-1],"\\+")))
fr[vars]
## Error in `[.data.frame`(fr, vars) : undefined columns selected

(因为在 + 上进行拆分会虚假地拆分 log(1+Days) 项)。

我一直在考虑沿着公式的解析树走下去:

ff[[3]]       ## log(1 + Days) + x + y
ff[[3]][[1]] ## `+`
ff[[3]][[2]] ## log(1 + Days) + x

但我还没有找到解决方案,看起来我正在掉进兔子洞。有想法吗?

最佳答案

这应该有效:

> fr[gsub(" ","",rownames(attr(terms.formula(ff), "factors")))]
log(Reaction) log(1+Days) x y
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4

感谢 Roman Luštrik 为我指明了正确的方向。

编辑:看起来您也可以将其从“变量”属性中取出:

fr[gsub(" ","",attr(terms(ff),"variables")[-1])]

编辑2:找到第一个问题案例,涉及I()offset():

ff <- I(log(Reaction)) ~ I(log(1+Days)) + x + y
fr[gsub(" ","",attr(terms(ff),"variables")[-1])]

不过,使用正则表达式很容易纠正这些问题。但是,如果您遇到类似问题中调用变量的情况,例如 log(x) 并在公式中与诸如 I(log(y)) 之类的内容一起使用code> 对于变量 y,这会变得非常困惑。

关于r - 从数据框中提取公式中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18017765/

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