gpt4 book ai didi

r - 在 [.data.table's j 中使用 lm(my_formula)

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

我已经养成了访问 j 中的 data.table 列的习惯即使我不需要:

require(data.table)
set.seed(1); n = 10
DT <- data.table(x=rnorm(n),y=rnorm(n))

frm <- formula(x~y)

DT[,lm(x~y)] # 1 works
DT[,lm(frm)] # 2 fails
lm(frm,data=DT) # 3 what I'll do instead

我希望 #2 可以工作,因为 lm应该在 DT 中搜索变量然后在全局环境中......有没有一种优雅的方式让 #2 之类的东西工作?

在这种情况下,我使用 lm ,它需要一个“数据”参数,所以 #3 工作得很好。

编辑。 请注意,这有效:
x1 <- DT$x
y1 <- DT$y
frm1 <- formula(x1~y1)
lm(frm1)

这也是:
rm(x1,y1)
bah <- function(){
x1 <- DT$x
y1 <- DT$y
frm1 <- formula(x1~y1)
lm(frm1)
}
bah()

编辑2。 但是,这失败了,说明了@eddi 的答案
frm1 <- formula(x1~y1)
bah1 <- function(){
x1 <- DT$x
y1 <- DT$y
lm(frm1)
}
bah1()

最佳答案

方式lm它会查找在提供的公式的环境中使用的变量。由于您在全局环境中创建公式,因此不会在 j 中查找。 -expression 环境,所以唯一的方法是使精确的表达式 lm(frm)工作是将适当的变量添加到正确的环境中:

DT[, {assign('x', x, environment(frm));
assign('y', y, environment(frm));
lm(frm)}]

现在显然这不是一个很好的解决方案,Arun 和 Josh 的建议要好得多,我只是把它放在这里是为了理解手头的问题。

编辑 另一种(可能更变态,而且相当脆弱)的方法是改变手头公式的环境(我在这里永久这样做,但你可以将其还原,或复制它然后再做):
DT[, {setattr(frm, '.Environment', get('SDenv', parent.frame(2))); lm(frm)}]

顺便说一句,这里发生了一件有趣的事情 - 无论何时使用 getj -表达式,所有变量都被构造(所以 不要 如果可以避免使用它),这就是为什么我不需要也使用 xy以某种方式为 data.table知道需要这些变量。

关于r - 在 [.data.table's j 中使用 lm(my_formula),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19311600/

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