我是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