第一次出现值后替换有序列

时间:2018-09-07 02:08:41

标签: r dplyr

每当上一年的列为1时,我都希望将下面的所有0列重新编码为1。

从此数据框开始:

library(tibble); library(dplyr)

(df <- tibble(id = c(1,2,3),
       `1997` = c(1,0,0), 
       `1998` = c(0,1,0), 
       `1999` = c(0,0,1)))
#> # A tibble: 3 x 4
#>      id `1997` `1998` `1999`
#>   <dbl>  <dbl>  <dbl>  <dbl>
#> 1     1      1      0      0
#> 2     2      0      1      0
#> 3     3      0      0      1

以此数据框结尾:

tibble(id = c(1,2,3),
       `1997` = c(1,0,0), 
       `1998` = c(1,1,0), 
       `1999` = c(1,1,1))
#> # A tibble: 3 x 4
#>      id `1997` `1998` `1999`
#>   <dbl>  <dbl>  <dbl>  <dbl>
#> 1     1      1      1      1
#> 2     2      0      1      1
#> 3     3      0      0      1

是否可以使用dplyrmutate_at / mutate_if函数来做到这一点?

我需要一种方法,仅选择年份列,找到值为1的最小年份列,然后根据该结果对所有较大的年份列进行变异。

# Method that uses dplyr::mutate_at?
# df %>% mutate_at(vars(`1997`:`1999`), funs(replace(., . == 0 & previousColumnVar == 1, 1)))

1 个答案:

答案 0 :(得分:1)

您可以尝试:

library(tidyverse)

df %>%
  gather(key, value, -id) %>%
  group_by(id) %>%
  mutate(value = +(cumsum(value) >= 1)) %>%
  spread(key, value)

哪个给:

## A tibble: 3 x 4
## Groups:   id [3]
#     id `1997` `1998` `1999`
#  <dbl>  <int>  <int>  <int>
#1     1      1      1      1
#2     2      0      1      1
#3     3      0      0      1