当 curlycurly 不起作用时如何将数据框列作为参数传递? (嵌套内的e.g.map函数)

How to pass dataframe columns as argument when curlycurly does not work? (e.g.map function within nest)

我很高兴将数据框列作为带有“curly curly”{{}} 的函数参数传递给例如过滤器()或select()。但这不适用于 nest 和 map (请参见下面的代码, lm 函数中的 {{x}} ),我不知道为什么。在这种情况下,您将如何处理?

我有以下代码,我想 运行 用于几个变量(而不仅仅是 var1,例如示例中的代码):

library(tidyverse)
library(broom)

var1 <- runif(100)
var2 <- rnorm(100)
var3 <- rnorm(100,mean=3)
group <- c(rep(1,25),rep(2,25),rep(3,25),rep(4,25))

data_set <- data.frame(var1,var2,var3,group)

nest_fct <- function(x){
  new <- data_set %>%
    filter(is.na({{x}}) != 1) %>% 
    select({{x}}, var2, group ) %>%
    nest(data = -group) %>% 
    mutate(
      fit = map(data,   ~ lm({{x}} ~  var2, data = .)),
      tidied = map(fit, tidy)) %>% 
    unnest(tidied) %>% 
    select(-data, -fit)
}
new <- nest_fct(var1)

我收到错误(抱歉,它是德语的):Fehler:mutate() 输入 fit 有问题。 x Variablenlängen sind unterschiedlich (gefunden für 'var2') i 输入 fitmap(data, ~lm(var1 ~ var2, data = .)).

(我想运行对每组做一个回归然后保存回归系数)

代码 运行 没有函数 "nest_fct":

new <- data_set %>%
  filter(is.na(var1) != 1) %>% 
  select(var1, var2, group ) %>%
  nest(data = -group) %>% 
  mutate(
    fit = map(data,   ~ lm(var1 ~  var2, data = .)),
    tidied = map(fit, tidy)) %>% 
  unnest(tidied) %>% 
  select(-data, -fit)

这是 exexpr/expr

的一种方法
nest_fct <- function(x){
  new <- data_set %>%
    filter(is.na({{x}}) != 1) %>% 
    select({{x}}, var2, group ) %>%
    nest(data = -group) %>% 
    mutate(
      fit = map(data,   ~ lm(rlang::expr(!! rlang::enexpr(x) ~ var2), data = .)),
      tidied = map(fit, tidy)) %>% 
    unnest(tidied) %>% 
    select(-data, -fit)
}
new <- nest_fct(var1)


new
# A tibble: 8 x 6
#  group term        estimate std.error statistic       p.value
#  <dbl> <chr>          <dbl>     <dbl>     <dbl>         <dbl>
#1     1 (Intercept)  0.475      0.0543    8.75   0.00000000896
#2     1 var2        -0.0250     0.0492   -0.507  0.617        
#3     2 (Intercept)  0.468      0.0544    8.60   0.0000000122 
#4     2 var2         0.0617     0.0495    1.25   0.225        
#5     3 (Intercept)  0.572      0.0616    9.29   0.00000000301
#6     3 var2         0.00304    0.0559    0.0544 0.957        
#7     4 (Intercept)  0.476      0.0575    8.29   0.0000000234 
#8     4 var2         0.180      0.0576    3.13   0.00473