【问题标题】:Expand rows per group while changing only one variable扩展每组的行,同时仅更改一个变量
【发布时间】:2021-02-26 11:12:05
【问题描述】:

我有一个这样的数据框:

library(tibble)

test <- tibble(
  id = rep(c("A", "B"), each = 3),
  time = rep(2000:2002, times = 2),
  value = c(2, 1, 10, 4, 3, 6)
)

# A tibble: 6 x 3
  id     time value
  <chr> <int> <dbl>
1 A      2000     2
2 A      2001     1
3 A      2002    10
4 B      2000     4
5 B      2001     3
6 B      2002     6

对于每个 id,我想将时间段延长回 1995 年。从 1995 年到 2000 年的值将保持不变,唯一必须改变的是年份。这是预期的输出:

# A tibble: 16 x 3
   id     time value
   <chr> <int> <dbl>
 1 A      1995     2
 2 A      1996     2
 3 A      1997     2
 4 A      1998     2
 5 A      1999     2
 6 A      2000     2
 7 A      2001     1
 8 A      2002    10
 9 B      1995     4
10 B      1996     4
11 B      1997     4
12 B      1998     4
13 B      1999     4
14 B      2000     4
15 B      2001     3
16 B      2002     6

我该怎么做? (如果可能,以 tidyverse 风格)

【问题讨论】:

    标签: r


    【解决方案1】:

    data.table 方法

    library( data.table )
    setDT(test)
    #create all combinations of id and year
    DT <- CJ( id = unique( test$id ), time = 1995:2002 )
    #rolling join value by ID and time (roll to nearest time in test)
    DT[, value := test[DT, value, roll = "nearest", on = .(id, time) ] ]
    
    #     id time value
    #  1:  A 1995     2
    #  2:  A 1996     2
    #  3:  A 1997     2
    #  4:  A 1998     2
    #  5:  A 1999     2
    #  6:  A 2000     2
    #  7:  A 2001     1
    #  8:  A 2002    10
    #  9:  B 1995     4
    # 10:  B 1996     4
    # 11:  B 1997     4
    # 12:  B 1998     4
    # 13:  B 1999     4
    # 14:  B 2000     4
    # 15:  B 2001     3
    # 16:  B 2002     6
    

    【讨论】:

    • 用滚动连接代替原来的答案,这里更适合...
    【解决方案2】:

    我们可以使用 completetime 从 1995 年到 max time 值创建行,每个 idfill NA 值具有最新可用值。

    library(dplyr)
    library(tidyr)
    
    test %>%
      group_by(id) %>%
      complete(time = 1995:max(time)) %>%
      fill(value, .direction = 'up')
    
    #   id     time value
    #   <chr> <int> <dbl>
    # 1 A      1995     2
    # 2 A      1996     2
    # 3 A      1997     2
    # 4 A      1998     2
    # 5 A      1999     2
    # 6 A      2000     2
    # 7 A      2001     1
    # 8 A      2002    10
    # 9 B      1995     4
    #10 B      1996     4
    #11 B      1997     4
    #12 B      1998     4
    #13 B      1999     4
    #14 B      2000     4
    #15 B      2001     3
    #16 B      2002     6
    

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      相关资源
      最近更新 更多