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

为purr::map()指定x和y变量的向量,并与dplyr::summarse_at()一起指定

  •  1
  • nadizan  · 技术社区  · 6 年前

    我有一个类似的数据集,但还有很多 r v 变量。

    set.seed(1000)
    tb <- tibble(grp = c(rep("A",4),rep("B",4)),
                 v1 = rnorm(8),
                 v2 = rnorm(8),
                 v3 = rnorm(8),
                 r1 = rnorm(8),
                 r2 = rnorm(8))
    

    对于每一个 V 变量,我想创建一个 lm() 具有 R 变量。

    这就是我目前为止所拥有的:

    lm fun<-函数(x,y)coef(lm(x~y))[2]

    tb %>% 
      nest(-grp) %>%
      mutate(lm_list = map(data, ~ .x %>% 
                                  summarise_at(colnames(tb)[c(2:4)], funs(r1=lm_fun), .$r1)),
             lm_list2= map(data, ~ .x %>% 
                             summarise_at(colnames(tb)[c(2:4)], funs(r2=lm_fun), .$r2)),) %>%
      select(grp,lm_list,lm_list2) %>%
      unnest()
    

    它给出了预期的输出:

    # A tibble: 2 x 7
      grp    v1_r1   v2_r1  v3_r1  v1_r2  v2_r2  v3_r2
      <chr>  <dbl>   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
    1 A     -0.188 -0.0972  0.858  0.130 0.136   1.21 
    2 B      0.208  0.935  -1.33  -0.339 0.0580 -0.840
    

    但是,我如何指定 R 矢量中的变量(以类似的方式指定 变量作为 colnames(tb)[...] .我不想复制意大利面的代码 R 我的完整数据中有一个变量。另外,是否可以用另一种方法来解决这个问题?

    请注意,执行此功能并不重要 LM-() ,可以是包含两个变量的任何函数。

    2 回复  |  直到 6 年前
        1
  •  1
  •   akrun    6 年前

    一个选项是循环通过内部的“r”列 map . 这简化了代码,因为我们使用的是相同的数据,但不同的“r”列

    library(tidyverse)
    tb %>% 
      nest(-grp) %>%
      mutate(lm_list = map(data,  function(x)
               map(paste0('r', 1:2), function(y) 
                 x %>% 
                    summarise_at(vars(names(.)[1:3]), funs(lm_fun), .[[y]]) %>% 
                    rename_all(~ paste(., y, sep="_")) ) %>% 
                bind_cols)) %>% 
       select(-data) %>% 
       unnest
    # A tibble: 2 x 7
    #  grp    v1_r1   v2_r1  v3_r1  v1_r2  v2_r2  v3_r2
    #   <chr>  <dbl>   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
    #1 A     -0.188 -0.0972  0.858  0.130 0.136   1.21 
    #2 B      0.208  0.935  -1.33  -0.339 0.0580 -0.840
    
        2
  •  1
  •   jdobres    6 年前

    另一个选择是 gather 突变/映射前的r水平:

    tb %>% 
      gather(r, value, starts_with('r')) %>% 
      nest(-r, -grp) %>% 
      mutate(lm_list = map(
        data, ~ .x %>% 
          summarise_at(colnames(tb)[c(2:4)], funs(lm_fun), .$value)
                             )) %>% 
      unnest(lm_list, .drop = T)
    
      grp   r         v1      v2     v3
      <chr> <chr>  <dbl>   <dbl>  <dbl>
    1 A     r1    -0.188 -0.0972  0.858
    2 B     r1     0.208  0.935  -1.33 
    3 A     r2     0.130  0.136   1.21 
    4 B     r2    -0.339  0.0580 -0.840
    
    推荐文章