r语言 - 创建跨时间段的平均值



我是R的初学者,但我有以下数据框架,其中有更多的观测值,其中我最多有三年91,99,07的每个'id'观测值。

我想通过'id'创建一个变量avg_ln_rd,如果第一个ln_rd观测值来自99年,则取'ln_rd'和'ln_rd'的平均值,如果第一个ln_rd观测值来自07年,则取'ln_rd'和'ln_rd'的平均值。

id  year ln_rd
<dbl> <dbl> <dbl>
1  1013  1991 3.51 
2  1013  1999 5.64 
3  1013  2007 4.26 
4  1021  1991 0.899
5  1021  1999 0.791
6  1021  2007 0.704
7  1034  1991 2.58 
8  1034  1999 3.72 
9  1034  2007 4.95 
10  1037  1991 0.262

我也已经删除了所有只存在于三年中的一年的'id'的观测值。

我的第一个想法是每年为ln_rd创建一个独立的变量,但然后我仍然需要按id过滤,我不知道如何做。

然后我尝试使用这些独立的变量来形成一个if子句。

df$lagln_rd_99 <- ifelse(df$year == 1999, df$ln_rd_91, NA)

但是我又不知道如何保持'id'固定。

任何帮助都将是非常感激的。

编辑:

我使用dplyr按id分组。我能不能把df按id排序然后创建一个新变量ln_rd但移动了一行?

如果所有年份都出现在一个组中,我还是不太清楚该怎么做,但这可能会有所帮助。

——edited——显示所需的输出。

library(dplyr)
df %>% 
group_by(id) %>% 
arrange(id, year) %>% 
mutate(avg91 = mean(c(ln_rd[year == 1991], ln_rd[year == 1999])), 
avg99 = mean(c(ln_rd[year == 1999], ln_rd[year == 2007])), 
avg91 = ifelse(year == 1991, avg91, NA), 
avg99 = ifelse(year == 2007, avg99, NA)) %>% 
ungroup()
# A tibble: 15 × 5
year    id  ln_rd  avg91 avg99
<int> <int>  <dbl>  <dbl> <dbl>
1  1991  3505 3.38    3.09  NA
2  1999  3505 2.80   NA     NA
3  1991  4584 1.45    1.34  NA
4  1999  4584 1.22   NA     NA
5  1991  5709 1.90    2.13  NA
6  1999  5709 2.36   NA     NA
7  2007  5709 3.11   NA      2.74
8  2007  9777 2.36   NA      2.36
9  1991 18729 4.82    5.07  NA
10  1999 18729 5.32   NA     NA
11  2007 18729 5.53   NA      5.42
12  1991 20054 0.588   0.307 NA
13  1999 20054 0.0266 NA     NA
14  1999 62169 1.91   NA     NA
15  2007 62169 1.45   NA      1.68

相关内容

  • 没有找到相关文章