r - 如何使用 lm、do、broom 和 dplyr 按组计算回归?

标签 r dplyr broom

考虑这个简单的例子

> dataframe <- data_frame(id = c(1,2,3,4,5,6),
+                         group = c(1,1,1,2,2,2),
+                         value = c(200,400,120,300,100,100))
> dataframe
# A tibble: 6 x 3
     id group value
  <dbl> <dbl> <dbl>
1     1     1   200
2     2     1   400
3     3     1   120
4     4     2   300
5     5     2   100
6     6     2   100

在这里,我想按 group 组对常量使用回归 value。我有 get_mean() 函数

get_mean <- function(data, myvar){
  col_name <- as.character(substitute(myvar))
  fmla <- as.formula(paste(col_name, "~ 1"))
  tidy(lm(data = data,fmla)) %>% pull(estimate)
}

天真的方法:

dataframe %>% group_by(group) %>% mutate(bug = get_mean(., value),
                                         Ineedthis = max(value))

# A tibble: 6 x 5
# Groups:   group [2]
     id group value      bug Ineedthis
  <dbl> <dbl> <dbl>    <dbl>     <dbl>
1     1     1   200 203.3333       400
2     2     1   400 203.3333       400
3     3     1   120 203.3333       400
4     4     2   300 203.3333       300
5     5     2   100 203.3333       300
6     6     2   100 203.3333       300

失败,因为您可以看到均值不是按组计算的。

众所周知,使用do 会起作用。

dataframe %>% group_by(group) %>% do(bug = get_mean(., value))
Source: local data frame [2 x 2]
Groups: <by row>

# A tibble: 2 x 2
  group       bug
* <dbl>    <list>
1     1 <dbl [1]>
2     2 <dbl [1]>

但是,我不知道如何使用 do 获取另一个 Ineedthis 变量,也不知道如何取消列出 bug 变量。我希望我的输出是:

# A tibble: 6 x 5
     id group value good         Ineedthis
  <dbl> <dbl> <dbl>    <dbl>     <dbl>
1     1     1   200 240            400
2     2     1   400 240            400
3     3     1   120 240            400
4     4     2   300 166.6666       300
5     5     2   100 166.6666       300
6     6     2   100 166.6666       300

有什么想法吗?谢谢!!

最佳答案

我对您的 get_mean 函数做了一些更改,但它在功能上是一样的。见:

get_mean <- function(., myvar){
  dat <- substitute(myvar) %>% data.frame(.) %>% setNames('vec')
  out <- lm(data = dat,'vec ~ 1')$coefficients[1] %>% unname(.)
  return(out)
}

允许我们做:

dataframe %>%
  group_by(group) %>%
  summarise(good = get_mean(., value), Ineedthis= max(value)) %>%
  left_join(dataframe, ., by = 'group')

导致:

  id group value     good Ineedthis
1  1     1   200 240.0000       400
2  2     1   400 240.0000       400
3  3     1   120 240.0000       400
4  4     2   300 166.6667       300
5  5     2   100 166.6667       300
6  6     2   100 166.6667       300

关于r - 如何使用 lm、do、broom 和 dplyr 按组计算回归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45864645/

相关文章:

r - 在数据帧上使用If/Else

r - R中带有data.table的交叉表

R 包未加载 `Imports` 包

r - 使用 r (dplyr) 中的一组值进行过滤

r - 如何使用 apply 或 dplyr 有条件地转换特定变量

r - 来自一系列线性模型的预测值

r - 将数据帧列表传递给 lm() 并查看结果

r - 向下填充带有 NA 的列的行(使用 R base 或 data.table)

r - "Multi-step"在 R 中使用 broom 和 dplyr 进行回归

r - dplyr过滤条件以区分unicode符号及其unicode表示形式