【问题标题】:Lag value to two rows R滞后值到两行 R
【发布时间】:2023-02-10 20:26:32
【问题描述】:

我想将一个值滞后于两个具有

这是数据:

df <- data.frame(wave = c(16, 20, 20, 36, 40, 40),
                 area = c(1,1,1,1,1,1),
                 party = c("A", "A", "A", "B", "B", "B"),
                 loyal = c(NA, 0, 1, NA, 0, 1),
                 ipref_1 = c(0.25, 0.25, 0.5, -0.25, 0.5, -0.25),
                 ipref_2 = c(0.5, 0.25, -0.25, -0.75, 0.5, -0.25),
                 ipref_3 = c(-0.5, -0.25, 0, 0.5, -0.25, 0))

看起来像:

wave area party loyal ipref_1 ipref_2 ipref_3
16    1     A    NA    0.25    0.50   -0.50
20    1     A     0    0.25    0.25   -0.25
20    1     A     1    0.50   -0.25    0.00
36    1     B    NA   -0.25   -0.75    0.50
40    1     B     0    0.50    0.50   -0.25
40    1     B     1   -0.25   -0.25    0.00

我想将第 16 波和第 36 波的 ipref_1、ipref_2 和 ipref_3 分别滞后于第 20 波和第 40 波。但是,在后面的波浪中有一个额外的变量loyal,分数为01。我想将波 16(和 36)的值滞后于波 20(和 40)的两行。

我试过:

df <- df %>% group_by(party, area) %>%
  mutate(l_ipref_1 = lag(ipref_1, 1, order_by = wave, na.rm =T),
         l_ipref_2 = lag(ipref_2, 1, order_by = wave, na.rm =T),
         l_ipref_3 = lag(ipref_3, 1, order_by = wave, na.rm =T))

但它给了我:

wave  area party loyal ipref_1 ipref_2 ipref_3 l_ipref_1 l_ipref_2 l_ipref_3
<dbl> <dbl> <chr> <dbl>   <dbl>   <dbl>   <dbl>     <dbl>     <dbl>     <dbl>
16     1 A        NA    0.25    0.5    -0.5      NA        NA        NA   
20     1 A         0    0.25    0.25   -0.25      0.25      0.5      -0.5 
20     1 A         1    0.5    -0.25    0         0.25      0.25     -0.25
36     1 B        NA   -0.25   -0.75    0.5      NA        NA        NA   
40     1 B         0    0.5     0.5    -0.25     -0.25     -0.75      0.5 
40     1 B         1   -0.25   -0.25    0         0.5       0.5      -0.25

在这里,在第 20 波(和第 40 波)中,loyal = 0 的得分落后于 loyal = 1,但我需要的是:

wave  area party loyal ipref_1 ipref_2 ipref_3 l_ipref_1 l_ipref_2 l_ipref_3
<dbl> <dbl> <chr> <dbl>   <dbl>   <dbl>   <dbl>     <dbl>     <dbl>     <dbl>
16     1 A        NA    0.25    0.5    -0.5      NA        NA        NA   
20     1 A         0    0.25    0.25   -0.25      0.25      0.5      -0.5 
20     1 A         1    0.5    -0.25    0         0.25      0.5      -0.5
36     1 B        NA   -0.25   -0.75    0.5      NA        NA        NA   
40     1 B         0    0.5     0.5    -0.25     -0.25     -0.75      0.5 
40     1 B         1   -0.25   -0.25    0        -0.25     -0.75      0.5

有什么建议么?非常感谢

【问题讨论】:

    标签: r dplyr lag


    【解决方案1】:

    这是一个data.table方法

    该方法的核心是ifelse-语句; ifelse(is.na(loyal), NA, x[1])。这意味着:如果 is.na(loyal) == TRUE,则返回值 NA,如果不是,则返回 ipref 列的第一个值(来自当前组)。

    ipref开头的任意数量列的解词

    library(data.table)
    cols <- grep("^ipref", names(df), value = TRUE)
    setDT(df)[, paste0("l_", cols) := 
                lapply(.SD, function(x) ifelse(is.na(loyal), NA, x[1])), 
              by = .(area, party), .SDcols = cols][]
    #    wave area party loyal ipref_1 ipref_2 ipref_3 l_ipref_1 l_ipref_2 l_ipref_3
    # 1:   16    1     A    NA    0.25    0.50   -0.50        NA        NA        NA
    # 2:   20    1     A     0    0.25    0.25   -0.25      0.25      0.50      -0.5
    # 3:   20    1     A     1    0.50   -0.25    0.00      0.25      0.50      -0.5
    # 4:   36    1     B    NA   -0.25   -0.75    0.50        NA        NA        NA
    # 5:   40    1     B     0    0.50    0.50   -0.25     -0.25     -0.75       0.5
    # 6:   40    1     B     1   -0.25   -0.25    0.00     -0.25     -0.75       0.5
    

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 2021-12-22
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2023-01-18
      • 2022-11-24
      相关资源
      最近更新 更多