面板数据:计算组平均值,同时从计算中省略第一个时间段。

3

我有一个关于一种mean()计算的问题。我使用带有两个标识符“ID”和“year”的面板数据集(使用plm包)。

我想计算变量“y”的组内平均值,但忽略计算的第一年的条目,然后仅在用于计算的年份中填充计算出的平均值。换句话说,我想在这个变量的每个ID的第一个条目中有NA。

面板数据是不平衡的,因此人们会在不同的时间点来来去去。一些人从一开始就一直留到结束,对于其他人,我只有三年的数据。

library(tidyverse)
library(plm)

ID <- c("a","a","a","a","a","b","b","b","b","c","c","c")
y <- c(9,2,5,3,3,9,1,2,3,9,2,5)
year<- c(2001,2002,2003,2004,2005,2001,2002,2003,2004,2002,2003,2004)
dt <- data.frame(ID,y,year)
dt <- pdata.frame(dt, index = c("ID","year"))

我首先尝试了一个过滤器来处理周期,就像这样:

dt <- dt %>% group_by(ID) %>% 
  filter(year %in% first(year)+1:last(year)) %>% 
  mutate(mean.y = mean(y))

但是那样做是不行的,说实话我并不感到惊讶,但我希望你知道我想要实现什么。最终结果应该像这样:

enter image description here

看看变量 y 的第一个条目" a-2001" 的值为 9 是如何被忽略的,以便它不会影响各个 a 的其他 y 条目的平均值 (2+5+3+3)/4。

希望你们能理解,非常感谢任何帮助。再见。

2个回答

2
这里有一个dplyr的解决方案。您可以计算除第一个值外所有值的平均值,然后使用is.na<-函数将mean.y的第一个元素指定为NA。
library(dplyr)
dt %>% group_by(ID) %>% mutate(mean.y = mean(y[-1L]), mean.y = `is.na<-`(mean.y, 1L))

输出

# A tibble: 12 x 4
# Groups:   ID [3]
   ID        y  year mean.y
   <chr> <dbl> <dbl>  <dbl>
 1 a         9  2001  NA   
 2 a         2  2002   3.25
 3 a         5  2003   3.25
 4 a         3  2004   3.25
 5 a         3  2005   3.25
 6 b         9  2001  NA   
 7 b         1  2002   2   
 8 b         2  2003   2   
 9 b         3  2004   2   
10 c         9  2002  NA   
11 c         2  2003   3.5 
12 c         5  2004   3.5 

更简洁地说,
dt %>% group_by(ID) %>% mutate(mean.y = mean(y[-1L])[n():1 %/% n() + 1L])

1
代码中有一个小错误。现在应该可以工作了。@tony13s - ekoam
顺便提一下@tony13s。如果这个或其他答案解决了你的问题,请考虑通过点击复选标记接受它。这表明您已经找到了解决方案,并为回答者和自己赢得了一些声誉。没有义务这样做。 - ekoam
谢谢@ekoam,请问你能解释一下is.na<-`(mean.y, 1L)吗? - Alvaro Morales
@AlvaroMorales 这是一个函数,基本上返回一个向量,与 mean.y 相同,只是第一个元素 (1L) 被替换为 NA 值。例如,\is.na<-`(c(1,2,3), 1L)将返回NA 2 3`。 - ekoam
有没有其他具有相同行为的函数? - Alvaro Morales
显示剩余2条评论

2

我们可以在mutate中使用ifelse。虽然代码量更多,但我认为它非常易读且容易理解其含义。

library(tidyverse)
library(plm)

dt %>% 
  group_by(ID) %>% 
  mutate(mean.y = ifelse(year == first(year),
                         NA,
                         mean(y[year != first(year)], na.rm = TRUE)))

#> # A tibble: 12 x 4
#> # Groups:   ID [3]
#>    ID        y year  mean.y
#>    <fct> <dbl> <fct>  <dbl>
#>  1 a         9 2001   NA   
#>  2 a         2 2002    3.25
#>  3 a         5 2003    3.25
#>  4 a         3 2004    3.25
#>  5 a         3 2005    3.25
#>  6 b         9 2001   NA   
#>  7 b         1 2002    2   
#>  8 b         2 2003    2   
#>  9 b         3 2004    2   
#> 10 c         9 2002   NA   
#> 11 c         2 2003    3.5 
#> 12 c         5 2004    3.5

这段内容由 reprex软件包 (v0.3.0) 生成于2022-01-23。


1
是的,你说得对,这很容易理解。我想这种方法也会帮助我以后的工作,非常感谢你。 - tony13s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接