结合dplyr :: summarise_at()为purrr :: map()指定x和y变量的向量

时间:2018-11-22 18:14:38

标签: r dplyr purrr

我有一个相似的数据集,但具有更多的rv变量。

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变量(以类似于将v变量指定为colnames(tb)[...]的方式。我不想复制粘贴我完整数据中每个r变量的代码,还有可能用另一种方法解决吗?

请注意,函数执行lm()并不重要,它可以是涉及两个变量的任何函数。

2 个答案:

答案 0 :(得分:1)

一个选择是遍历map内的'r'列。由于我们使用相同的数据但使用不同的“ 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

答案 1 :(得分:1)

另一种选择是在突变/映射之前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