我正在编写一个自定义函数,它使用帮助为列表的每个元素执行线性混合效应模型。代码块可以完美地工作,但是当我将其转换为自定义函数时,不清楚如何输入与列表元素中的各个列对应的参数。
如果我让自定义函数工作,我可以将其用于任意数量的变量。否则,我将不得不为不同的变量复制和粘贴相同的代码。
如果我让自定义函数工作,我可以将其用于任意数量的变量。否则,我将不得不为不同的变量复制和粘贴相同的代码。
# libraries needed
library(purrr)
library(lmerTest)
data(mtcars)
# create a list of dataframes from mtcars based on a split
group_list <- split(mtcars, mtcars$am)
# goal: to do linear mixed effects model for each dataframe and combining the results neatly in a dataframe
# achieving this outside of a custom function
group_list %>%
purrr::map(.x = (.),
.f = ~ lmerTest::lmer(
scale(mpg) ~ scale(wt) + (wt | cyl),
data = (.),
REML = FALSE
)) %>%
purrr::map(.f = ~ coef(summary(.))[-c(1),]) %>%
base::do.call(what = cbind.data.frame, args = .) %>%
tibble::rownames_to_column(df = ., var = "Effect")
#> Effect 0 1
#> 1 Estimate -0.3318711 -9.089148e-01
#> 2 Std. Error 0.2104268 1.156500e-01
#> 3 df 0.6084658 1.300000e+01
#> 4 t value -1.5771334 -7.859187e+00
#> 5 Pr(>|t|) 0.4558206 2.714599e-06
# preparing the custom function to do the same
lmer_group <- function(list, x, y) {
list %>%
purrr::map(
.x = (.),
.f = ~ lmerTest::lmer(
scale(y) ~ scale(x) + (x | cyl),
data = (.),
REML = FALSE
)
) %>%
purrr::map(.f = ~ coef(summary(.))[-c(1),]) %>%
base::do.call(what = cbind.data.frame, args = .) %>%
tibble::rownames_to_column(df = ., var = "Effect")
}
# doing the same analysis with a custom function
lmer_group(list = group_list, x = wt, y = mpg) # attempt 1
#> Error in scale(y): object 'mpg' not found
lmer_group(list = group_list, x = 'wt', y = 'mpg') # attempt 2
#> Error in colMeans(x, na.rm = TRUE): 'x' must be numeric
lmer_group(
list = group_list,
x = lapply(group_list, `[`, 'wt'),
y = lapply(group_list, `[`, 'mpg')
) # attempt 3
#> Error in colMeans(x, na.rm = TRUE): 'x' must be numeric
这段文字是由 reprex package(版本号为v0.1.1.9000)在2018年1月28日创建的。
rlang::quo()
和相关函数。另请参阅 https://dev59.com/bFcQ5IYBdhLWcg3wCvc4#44080671。 - wibeasley