【问题标题】:How to replace values in specific rows based on a previous row?如何根据前一行替换特定行中的值?
【发布时间】:2021-10-09 04:47:36
【问题描述】:

目前我的数据框类似于下面的数据框,但有数百个类似的行:

vol onset   con num signal     sec stim 
2   NA      NA  NA  612.7394    4   0  
3   5.32    neg 1   611.7746    6   0   
4   NA      NA  NA  612.7696    8   0   
5   NA      NA  NA  612.6067    10  0   
6   11.54   mb  3   615.3129    12  1   
7   NA      NA  NA  613.9639    14  0   
8   NA      NA  NA  615.4326    16  0   
9   NA      NA  NA  613.9639    18  0   
10  NA      NA  NA  615.4326    20  0   
11  21.48   neg 2   613.9639    22  0   
12  NA      NA  NA  615.4326    24  0   
13  NA      NA  NA  613.9639    26  0   
14  NA      NA  NA  615.4326    28  0   

这里,stim 等于 1,而num 等于 3;否则,stim 等于 0。

但是,当num 等于 3 时,我希望后续两行中 stim 的值等于 1。我还希望 connum向下进行到这两行,如下图。

vol onset   con num signal     sec stim 
2   NA      NA  NA  612.7394    4   0  
3   5.32    neg 1   611.7746    6   0   
4   NA      NA  NA  612.7696    8   0   
5   NA      NA  NA  612.6067    10  0   
6   11.54   mb  3   615.3129    12  1   
7   NA      mb  3   613.9639    14  1   
8   NA      mb  3   615.4326    16  1   
9   NA      NA  NA  613.9639    18  0   
10  NA      NA  NA  615.4326    20  0   
11  21.48   neg 2   613.9639    22  0   
12  NA      NA  NA  615.4326    24  0   
13  NA      NA  NA  613.9639    26  0   
14  NA      NA  NA  615.4326    28  0   

我该怎么做?

【问题讨论】:

    标签: r dataframe replace row


    【解决方案1】:

    您可以使用dplyr 中的laglead 函数-

    library(dplyr)
    
    df <- df %>%
      mutate(stim = as.integer(lag(stim) == 1 | stim == 1 | lead(stim) == 1), 
             num = replace(num, stim == 1, 3))
    df
    
    #   vol onset  con num   signal sec stim
    #1    2    NA <NA>  NA 612.7394   4   NA
    #2    3  5.32  neg   1 611.7746   6    0
    #3    4    NA <NA>  NA 612.7696   8    0
    #4    5    NA <NA>   3 612.6067  10    1
    #5    6 11.54   mb   3 615.3129  12    1
    #6    7    NA <NA>   3 613.9639  14    1
    #7    8    NA <NA>  NA 615.4326  16    0
    #8    9    NA <NA>  NA 613.9639  18    0
    #9   10    NA <NA>  NA 615.4326  20    0
    #10  11 21.48  neg   2 613.9639  22    0
    #11  12    NA <NA>  NA 615.4326  24    0
    #12  13    NA <NA>  NA 613.9639  26    0
    #13  14    NA <NA>  NA 615.4326  28   NA
    

    或者在基础 R 中可能更简单 -

    inds <- which(df$stim == 1)
    df$stim[c(inds-1, inds + 1)] <- 1
    df$num[df$stim == 1] <- 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-15
      • 2021-01-05
      • 2022-07-14
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多