如何计时R中的数据行为按组行为?

问题描述

我想对数据进行定时处理,以便通过fixed effects(OLS)手动运行ordinary least squares回归。 “时间行为”是指计算单位(例如人)的组均值,并将其减去。我以为这段代码可以完成任务,但是它为所有行产生了平均值:

set.seed(5)
paneldata = data.frame(id=c(1,1,2,2),year=seq(from=2003,to=2009,by=1),x = runif(14,min = 0,max = 25),y = runif(14,)

paneldata %>%
  group_by(id) %>%
  mutate(MeanValue = mean(x),tdm_x = x - MeanValue)

# A tibble: 14 x 6
# Groups:   id [2]
      id  year     x     y MeanValue  tdm_x
   <dbl> <dbl> <dbl> <dbl>     <dbl>  <dbl>
 1     1  2003  5.01  6.56      12.4 -7.38 
 2     1  2004 17.1   5.05      12.4  4.74 
 3     1  2005 22.9   9.69      12.4 10.5  
 4     1  2006  7.11 22.2       12.4 -5.28 
 5     1  2007  2.62 13.9       12.4 -9.77 
 6     1  2008 17.5  21.1       12.4  5.14 
 7     1  2009 13.2  22.3       12.4  0.812
 8     2  2003 20.2  18.0       12.4  7.81 
 9     2  2004 23.9   5.28      12.4 11.5  
10     2  2005  2.76  5.64      12.4 -9.63 
11     2  2006  6.83  3.50      12.4 -5.55 
12     2  2007 12.3  12.0       12.4 -0.124
13     2  2008  7.96 10.9       12.4 -4.43 
14     2  2009 14.0  24.1       12.4  1.59 

如何修改我的代码以使时间贬值运行?我也正在寻找一种自动化几个变量的方法(不要一遍又一遍地重复mutate)。谢谢

解决方法

似乎“重均”问题无法重现。至于在多个列中重复取消定义,可以使用mutate(across())

paneldata %>%
  group_by(id) %>%
  mutate(across(c("x","y"),~ .x - mean(.x),.names = "tdm_{col}"))

#> # A tibble: 14 x 6
#> # Groups:   id [2]
#>       id  year     x     y  tdm_x  tdm_y
#>    <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>
#>  1     1  2003  5.01  6.56 -7.21  -7.82 
#>  2     1  2004 17.1   5.05  4.91  -9.34 
#>  3     1  2005 22.9   9.69 10.7   -4.69 
#>  4     1  2006  7.11 22.2  -5.11   7.81 
#>  5     1  2007  2.62 13.9  -9.60  -0.510
#>  6     1  2008 17.5  21.1   5.31   6.67 
#>  7     1  2009 13.2  22.3   0.983  7.87 
#>  8     2  2003 20.2  18.0   7.64   6.66 
#>  9     2  2004 23.9   5.28 11.4   -6.08 
#> 10     2  2005  2.76  5.64 -9.80  -5.72 
#> 11     2  2006  6.83  3.50 -5.73  -7.86 
#> 12     2  2007 12.3  12.0  -0.295  0.637
#> 13     2  2008  7.96 10.9  -4.60  -0.426
#> 14     2  2009 14.0  24.1   1.42  12.8 

,

这里是mutate_at

的一个选项
 library(dplyr)
 paneldata %>%
   group_by(id) %>%
   mutate_at(vars(c("x",list(tdm = ~ . - mean(.)))