代码之家  ›  专栏  ›  技术社区  ›  Dan

将lm与map2一起应用

  •  3
  • Dan  · 技术社区  · 5 年前

    我在努力学习 purrr 的映射函数 map2 申请 lm . 使用 mtcars 数据集,我用变量名的组合创建一个数据框架,如下所示:

    # Load libraries
    library(dplyr)
    library(purrr)
    
    # Subset data
    df <- mtcars %>% select(mpg:qsec) 
    
    # Get variable names
    car_vars <- colnames(df)
    
    # Create data frame of variable names
    foo <- combn(car_vars, 2) %>% t %>% data.frame
    
    # > head(foo)
    #    X1   X2
    # 1 mpg  cyl
    # 2 mpg disp
    # 3 mpg   hp
    # 4 mpg drat
    # 5 mpg   wt
    # 6 mpg qsec
    

    接下来,我有一个函数,它取两个变量的名称,并适合一个线性模型:

    # Fit model
    fit_lm <- function(c1, c2){
      lm(paste(c1, c2, sep = "~"), data = df)
    } 
    

    我可以用这个 微管相关蛋白2 像这样:

    # Fit all the models 
    map2(foo$X1, foo$X2, fit_lm)
    

    列出 LM 打印时类似于此的对象:

    # [[1]]
    # 
    # Call:
    #   lm(formula = paste(c1, c2, sep = "~"), data = df)
    # 
    # Coefficients:
    #   (Intercept)          cyl  
    # 37.885       -2.876  
    

    伟大的!现在,这里是我绊倒的地方。我想加上这些 LM 对象作为数据框中的一列,因此我方便地将变量名与模型本身放在同一行中。所以,我用 dplyr mutate 具有 微管相关蛋白2 .

    # Not so successful
    foo %>% mutate(mods = map2(X1, X2, fit_lm))
    

    这个 mods 生成的列具有类null,而不是 LM 看起来有点像 dput A的 LM 对象,与我以前(成功)的尝试不同。显然,我误解了 微管相关蛋白2 作品。有人能解释我的错误吗?

    1 回复  |  直到 5 年前
        1
  •  4
  •   Julius Vainora    5 年前

    就结果本身而言,你做的很好:

    foo <- foo %>% mutate(mods = map2(X1, X2, fit_lm))
    str(foo, max.level = 1)
    # 'data.frame': 21 obs. of  3 variables:
    #  $ X1  : Factor w/ 6 levels "cyl","disp","drat",..: 5 5 5 5 5 5 1 1 1 1 ...
    #  $ X2  : Factor w/ 6 levels "cyl","disp","drat",..: 1 2 4 3 6 5 2 4 3 6 ...
    #  $ mods:List of 21
    

    问题很简单

    class(foo)
    # [1] "data.frame"
    

    以及像 lm 全班都印着 print.data.frame . 因此,我们可以用 print.tbl ,我们只需要转换 foo tibble :

    foo <- as.tbl(foo)
    foo
    # A tibble: 21 x 3
    #    X1    X2    mods    
    #    <fct> <fct> <list>  
    #  1 mpg   cyl   <S3: lm>
    #  2 mpg   disp  <S3: lm>
    #  3 mpg   hp    <S3: lm>
    #  4 mpg   drat  <S3: lm>
    #  5 mpg   wt    <S3: lm>
    #  6 mpg   qsec  <S3: lm>
    #  7 cyl   disp  <S3: lm>
    #  8 cyl   hp    <S3: lm>
    #  9 cyl   drat  <S3: lm>
    # 10 cyl   wt    <S3: lm>
    # … with 11 more rows