我正在使用fixest::feols()并且我有一個函式,我想將引數傳遞給它,以便使用該subset =引數對資料進行子集化。但是,當不斷收到錯誤時:The argument 'subset' is a formula whose variables must be in the data set given in argument 'data'.
我嘗試了以下代碼:
library(fixest)
cars <- mtcars
my_fun <- function(data, hp.c.off) {
feols(mpg ~ disp drat,
data = data,
subset = ~ hp > substitute(hp.c.off))
}
my_fun(data = cars, 150)
我的預期結果與鍵入以下內容相同:
feols(mpg ~ disp drat,
data = cars,
subset = ~ hp > 150)
我知道在將它傳遞給公式hp.c.off 之前我必須替換它的值。可以通過首先創建一個字串運算式然后使用來做到這一點,as.formula()但是,我想知道是否有更好的方法來以編程方式構建不需要先創建字串運算式然后將其轉換為公式的運算式。
謝謝!
uj5u.com熱心網友回復:
簡單的選項是將運算式作為引數傳遞給函式
my_fun <- function(data,expr = ~ hp > 150){
feols(mpg ~ disp drat,
data = data,
subset = expr)
}
-測驗
> my_fun(data = cars)
OLS estimation, Dep. Var.: mpg
Observations: 13
Standard-errors: IID
Estimate Std. Error t value Pr(>|t|)
(Intercept) 23.414923 8.019808 2.919636 0.015310 *
disp -0.021349 0.008284 -2.577276 0.027545 *
drat -0.201284 2.014207 -0.099932 0.922373
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
RMSE: 2.16851 Adj. R2: 0.300667
uj5u.com熱心網友回復:
您可以使用rlang::new_formula(), withrlang::expr()來參考 rhs 并!!rlang::enexpr()捕獲和注入hp.c.off引數。
我沒有安裝 fixst,但這演示了在函式中構建公式:
library(rlang)
cars <- mtcars
my_fun <- function(data, hp.c.off) {
new_formula(NULL, expr(hp > !!enexpr(hp.c.off)))
}
my_fun(data = cars, 150)
# ~hp > 150
# <environment: 0x1405e38>
uj5u.com熱心網友回復:
1)將公式創建為字串,然后將其轉換為公式。
my_fun <- function(data, hp.c.off) {
feols(mpg ~ disp drat,
data = data,
subset = as.formula(paste("~ hp >", hp.c.off)))
}
2)或者只是不使用subset=引數,而是使用data引數 withsubset代替。
my_fun <- function(data, hp.c.off) {
feols(mpg ~ disp drat,
data = subset(data, hp > hp.c.off))
}
my_fun(data = cars, 150)
3)subset=或使用可以是邏輯向量的事實
my_fun <- function(data, hp.c.off) {
feols(mpg ~ disp drat,
data = data,
subset = data$hp > hp.c.off)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/532994.html
