每当上一年的列为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
是否可以使用dplyr
和mutate_at
/ mutate_if
函数来做到这一点?
我需要一种方法,仅选择年份列,找到值为1的最小年份列,然后根据该结果对所有较大的年份列进行变异。
# Method that uses dplyr::mutate_at?
# df %>% mutate_at(vars(`1997`:`1999`), funs(replace(., . == 0 & previousColumnVar == 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