将面板数据的每一单元中的一个值替换为另一个值
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
我有一个面板数据。感兴趣的变量有两个值,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