将面板数据的每一单元中的一个值替换为另一个值

replace one value with other value in every units of panel data

我有一个面板数据。感兴趣的变量有两个值,1 和 0。如果 1 在 0 前面,我想按组用 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