如何用dplyr生成排除当前观测的家庭残疾组内最大值变量
解决方法:生成组内排除当前观测的残疾人指示变量
针对你需要判断家庭中是否存在除自身外的残疾人的需求,这里提供两种基于dplyr的高效实现方案:
方法一:利用求和判断(适用于0/1变量)
由于diffany是0/1编码的变量(1=残疾,0=非残疾),我们可以通过计算家庭总残疾人数减去当前个体的残疾状态,直接判断是否存在其他残疾人:
library(dplyr) # 示例数据 cps <- data.frame(householdid = c(1,1,1,2,2,2,2,3,3,3,4,4,4,4,5,5,5,5,5), diffany = c(1,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0)) # 生成目标变量 cps <- cps %>% group_by(householdid) %>% mutate(has_other_disabled = as.integer(sum(diffany, na.rm = TRUE) - diffany > 0)) %>% ungroup()
逻辑说明
sum(diffany, na.rm = TRUE):计算当前家庭内所有成员的残疾总人数(自动忽略NA值)- 减去当前个体的
diffany,得到除自身外的家庭残疾人数 - 若结果大于0,说明存在其他残疾人,用
as.integer()将布尔判断结果转为1/0格式
方法二:直接取排除当前行的最大值(通用型)
如果你的变量不是0/1格式(比如表示残疾程度的连续值),或者需要严格取组内除当前观测外的最大值,可以用cur_group_rows()定位当前行,排除后再计算最大值:
cps <- cps %>% group_by(householdid) %>% mutate(has_other_disabled = as.integer(max(diffany[-cur_group_rows()], na.rm = TRUE))) %>% ungroup()
逻辑说明
cur_group_rows():返回当前分组内的行索引diffany[-cur_group_rows()]:提取组内除当前观测外的所有diffany值max(..., na.rm = TRUE):取这些值的最大值,再转为1/0格式(对应原变量0/1的场景,最大值1表示存在其他残疾人)
验证结果
处理后的数据核心列结果如下,完全符合需求:
| householdid | diffany | has_other_disabled |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 1 | 1 |
| 1 | 0 | 1 |
| 2 | 0 | 1 |
| 2 | 0 | 1 |
| 2 | 0 | 1 |
| 2 | 1 | 0 |
| 3 | 0 | 1 |
| 3 | 0 | 1 |
| 3 | 1 | 0 |
| 4 | 0 | 1 |
| 4 | 1 | 0 |
| 4 | 0 | 1 |
| 4 | 0 | 1 |
| 5 | 0 | 0 |
| 5 | 0 | 0 |
| 5 | 0 | 0 |
| 5 | 0 | 0 |
| 5 | 0 | 0 |
内容的提问来源于stack exchange,提问作者statisticsing
相关产品推荐
相关产品推荐

