如何映射嵌套的数据框,并存储多列作为输出

问题描述 投票:2回答:1

我的数据结构如下:

test <- data.frame(
   id= rep(1:3, each=20),
   count  = rnorm(60, mean=5, sd=1),
   covar1 = rnorm(60, mean=10, sd=3),
   covar2 = rnorm(60, mean=95, sd=5),
   covar3 = rnorm(60, mean=30, sd=5)
   )

然后我将其嵌套在id

test <- test %>% nest(-id)

对于给定的ID,我想将模型应用于每个数据covar列。然后,我想将结果存储在单独的列中。我可以这样做,如下所示:

test <- test %>% mutate(covar1_lm = map(data, ~lm(count ~ covar1, data=.x)),
                        covar2_lm = map(data, ~lm(count ~ covar2, data=.x)),
                        covar3_lm = map(data, ~lm(count ~ covar3, data=.x)))

哪个给出我想要的输出:

> test
# A tibble: 3 x 5
     id data              covar1_lm covar2_lm covar3_lm
  <int> <list>            <list>    <list>    <list>   
1     1 <tibble [20 × 4]> <lm>      <lm>      <lm>     
2     2 <tibble [20 × 4]> <lm>      <lm>      <lm>     
3     3 <tibble [20 × 4]> <lm>      <lm>      <lm>   

问题是我的真实数据有很多covar列,因此我想减少样板代码。因此,我猜测我需要一些动态变量名的概念,但我无法弄清楚如何映射一组动态的列名?

r purrr
1个回答
2
投票

您可以先pivot_longer()数据集,以便每个数据集的每个协变量都有一个观测值(行)。然后在每个协变量内执行模型。

test %>%
  pivot_longer(starts_with("covar"),
               names_to = "covariate") %>%
  group_by(id, covariate) %>%
  summarize(model = list(lm(count ~ value)))

您现在对ID和协变量的每种组合都有一个观察值。

# A tibble: 9 x 3
# Groups:   id [3]
     id covariate model 
  <int> <chr>     <list>
1     1 covar1    <lm>  
2     1 covar2    <lm>  
3     1 covar3    <lm>  
4     2 covar1    <lm>  
5     2 covar2    <lm>  
6     2 covar3    <lm>  
7     3 covar1    <lm>  
8     3 covar2    <lm>  
9     3 covar3    <lm>  

[如果您想将其转换为相同的结果,则可以将其通过管道传输到pivot_wider(names_from = covariate, values_from = model)。 (但是请注意,每个模型只有一行,这样可以更轻松地浏览和可视化模型,尤其是当您使用broom::tidy()整理每个模型并取消嵌套时)。


上述group_by()/summarize()的替代方法是将它们嵌套:

test %>%
  pivot_longer(starts_with("covar"),
               names_to = "covariate") %>%
  group_by(id, covariate) %>%
  nest() %>%
  mutate(model = map(data, ~ lm(count ~ value, data = .x)))
© www.soinside.com 2019 - 2024. All rights reserved.