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

6jjcrrmo  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(110)

我是R的初学者,但我有下面的数据框,其中有更多的观察,我最多有三年91,99,07的每个"id"观察。
我想创建一个变量avg_ln_rd by 'id',如果第一个ln_rd观测值来自99,则该变量取91年的'ln_rd'和'ln_rd'的平均值;如果第一个ln_rd观测值来自07,则该变量取99年的平均值。

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分组,然后我可以按id对df排序,并创建一个新变量ln_rd,但移动一行吗?

nvbavucw

nvbavucw1#

仍然有点不清楚该怎么做,如果所有的年份都存在于一个组中,但这可能会有帮助。
-- 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

相关问题