у меня есть панель данных. интересующая переменная имеет два значения: 1 и 0. Я хотел бы заменить 0 на 1 по группе, если 1 находится перед 0 . Данные следующие,
id <- c(1,1,2,2,2,3,3,3,4,4);
burden <- c(0,0,0,1,0,1,0,0,0,1)
я ожидаю получить следующие результаты,
burden <- c(0,0,0,1,1,1,1,1,0,1)
Спасибо за любую помощь заранее!
Это мое решение с использованием базы R
# Splitting Burden into groups according to the value in id
split_burden <- split(burden,id)
#$`1`
#[1] 0 0
#
#$`2`
#[1] 0 1 0
#
#$`3`
#[1] 1 0 0
#
#$`4`
#[1] 0 1
# for all groups apply cummax to each group with sapply
# if there is a 1 the value of cummax for all following
# elements in this group will be 1
split_burden_filled <- sapply(split_burden, cummax)
#$`1`
#[1] 0 0
#
#$`2`
#[1] 0 1 1
#
#$`3`
#[1] 1 1 1
#
#$`4`
#[1] 0 1
# Put the groups back together to one vector
solution <- unsplit(split_burden_filled,id)
#[1] 0 0 0 1 1 1 1 1 0 1
Обратите внимание, что это всегда правильно, только если burden
является двоичным.
Вы можете просто использовать tapply
для просмотра групп.
id <- c(1,1,2,2,2,3,3,3,4,4)
burden <- c(0,0,0,1,0,1,0,0,0,1)
unlist(tapply(burden, id, \(x) cummax(x)))
#> 11 12 21 22 23 31 32 33 41 42
#> 0 0 0 1 1 1 1 1 0 1