根据迭代多行的另一列的值来改变新列

Rae*_*med 1 r conditional-statements dplyr tidyverse

library(dplyr)

df <- tibble(year = 1951:2000,
             val = rnorm(50))
Run Code Online (Sandbox Code Playgroud)

假设df上述情况,我想cond向 tibble 添加一个额外的列(例如 ),使其值取决于列 val 的前两行。

换句话说,如果 (val[i-1] & val[i-2]) < 0 ,则将值 1 赋予 cond[i],否则为 0

All*_*ron 5

您可以使用lag,它需要第二个参数来告诉函数您希望向量滞后多少步。因此,如果lag(val) < 0满足lag(val, 2) < 0您的标准。我已将其包装在 中tidyr::replace_na,假设您希望未定义条件的前两行为 0。

set.seed(3)

df <- tibble(year = 1951:2000, val = rnorm(50))

df %>% mutate(cond = tidyr::replace_na(as.numeric(lag(val) < 0 & lag(val, 2) < 0), 0))

#> # A tibble: 50 x 3
#>     year     val  cond
#>    <int>   <dbl> <dbl>
#>  1  1951 -0.962      0
#>  2  1952 -0.293      0
#>  3  1953  0.259      1
#>  4  1954 -1.15       0
#>  5  1955  0.196      0
#>  6  1956  0.0301     0
#>  7  1957  0.0854     0
#>  8  1958  1.12       0
#>  9  1959 -1.22       0
#> 10  1960  1.27       0
#> # ... with 40 more rows
Run Code Online (Sandbox Code Playgroud)