如何在 dplyr 的常规变异中创建基于 lm 的变量?

how to create a variable based on lm in a regular mutate in dplyr?

考虑这个简单的例子:

library(dplyr)
library(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))

# 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中不同值的数量(我可以使用dplyr::n_distinct),另一个是向量1上value回归的常数项。那是

的输出
tidy(lm(data = dataframe, value ~ 1)) %>% select(estimate)

 estimate
1 203.3333

这里的难点在于将这两个简单的输出组合成一个 mutate 保留分组的语句。

我试过类似的方法:

formula1 <- function(data, myvar){
tidy(lm(data = data, myvar ~ 1)) %>% select(estimate)
}

dataframe %>% group_by(group) %>% 
  mutate(distinct = n_distinct(value),
         mean = formula1(., value))

但这不起作用。我在这里缺少什么? 谢谢!

如果您使用 pull 代替 select,此方法将起作用。这从 tidy 输出中提取单个 estimate 值。

formula1 <- function(data, myvar){
     tidy(lm(data = data, myvar ~ 1)) %>% pull(estimate)
}

dataframe %>% 
     group_by(group) %>% 
     mutate(distinct = n_distinct(value),
            mean = formula1(., value))

# A tibble: 6 x 5
# Groups:   group [2]
     id group value distinct     mean
  <dbl> <dbl> <dbl>    <int>    <dbl>
1     1     1   200        3 240.0000
2     2     1   400        3 240.0000
3     3     1   120        3 240.0000
4     4     2   300        2 166.6667
5     5     2   100        2 166.6667
6     6     2   100        2 166.6667