【问题标题】:how to split dataframe with some sub-levels of certain columns and apply model in tidyverse如何使用某些列的某些子级别拆分数据框并在 tidyverse 中应用模型
【发布时间】:2017-12-30 06:47:19
【问题描述】:

我以钻石数据集为例。我可以通过剪切和颜色分割数据集,然后应用模型并提取 r-square,如下所示。

diamonds %>% group_by(cut, color) %>% 
            do(model=lm(price~carat, data=.)) %>%
            mutate(r2 = summary(model)$adj.r.squared) %>% 
            select(-model)

问题是我是否只想按剪切和颜色的某些子级别对数据进行分组。例如:

cut_sub<- as.factor(c('Good','Fair'))
color_sub <- as.factor(c('E', 'J'))

我应该如何修改上面的代码来实现这一点?我尝试了谷歌搜索,但找不到解决方案。

【问题讨论】:

  • 为什么不简单地使用filter() 并只保留相关数据?比如:diamonds %&gt;% filter(cut %in% c("Fair", "Good"), color %in% c("E", "J")) %&gt;% group_by(cut, color) %&gt;% ...

标签: r dplyr tidyverse purrr


【解决方案1】:

这是purrr 的方法:

diamonds %>% 
  filter(cut %in% c("Fair", "Good"), 
         color %in% c("E", "J")) %>% 
  slice_rows(c("cut", "color")) %>% 
  by_slice(function(.x) {
    lm(price~carat, data = .x) %>% 
      summary %>% 
      .$adj.r.squared
  }, .to = "r2") %>% 
  unnest(r2)

【讨论】:

  • 在最新版本的purrr 中,基于数据帧的映射器(如slice_rowsby_slice)已移至名为purrrlyr 的新包中。
【解决方案2】:

这是一个使用purrrdevel 的想法v0.2.2.9000

diamonds %>% 
  filter(cut %in% c("Fair", "Good"), 
         color %in% c("E", "J")) %>% 
  group_by(cut, color) %>%
  nest() %>%
  mutate(model = map(data, .f = ~lm(price ~ carat, data = .)) %>% 
           map(summary) %>% map_dbl("adj.r.squared"))

这给出了:

## A tibble: 4 x 4
#    cut color               data     model
#  <ord> <ord>             <list>     <dbl>
#1  Good     E <tibble [933 x 8]> 0.8298957
#2  Good     J <tibble [307 x 8]> 0.9176254
#3  Fair     E <tibble [224 x 8]> 0.8092058
#4  Fair     J <tibble [119 x 8]> 0.7567011

【讨论】:

    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多