如何按家庭非零薪资数量筛选R语言DataFrame为单/双收入者数据集
按家庭分组筛选单/双收入者数据集的正确实现方法
原始数据集
首先给出用于测试的df数据框:
df <- data.frame( "id" = c(1,1,1,2,2,2,3,3,3,4,4,4,5,5), "relation" = c(1,2,3,1,2,3,1,2,3,1,2,3,1,2), "salary" = c(20,10,0,30,0,0,10,0,0,40,45,42,15,0) )
需求说明
按id(家庭)分组,将数据集拆分为两类:
- 单收入者家庭:组内仅1个成员薪资非零
- 双收入者家庭:组内至少2个成员薪资非零
原代码问题分析
你写的代码存在两个核心错误:
- 分组依据错误:数据框中没有
address字段,应该按id分组 - 筛选逻辑错误:
all(salary >=2)或all(salary ==1)的逻辑完全不符合需求——你需要统计每组内非零薪资的成员数量,而非判断所有成员薪资是否满足某个数值条件
正确实现代码
使用dplyr包的分组+筛选逻辑,直接在分组后计算每组的非零薪资数来筛选:
筛选双收入者家庭
library(dplyr) two_earner <- df %>% group_by(id) %>% filter(sum(salary != 0) >= 2) %>% ungroup() # 取消分组,得到常规数据框
筛选单收入者家庭
one_earner <- df %>% group_by(id) %>% filter(sum(salary != 0) == 1) %>% ungroup()
验证输出
运行上述代码后,输出结果与预期一致:
one_earner结果:
# A tibble: 8 × 3 id relation salary <dbl> <dbl> <dbl> 1 2 1 30 2 2 2 0 3 2 3 0 4 3 1 10 5 3 2 0 6 3 3 0 7 5 1 15 8 5 2 0
two_earner结果:
# A tibble: 6 × 3 id relation salary <dbl> <dbl> <dbl> 1 1 1 20 2 1 2 10 3 1 3 0 4 4 1 40 5 4 2 45 6 4 3 42
内容的提问来源于stack exchange,提问作者mehmo
相关产品推荐
相关产品推荐

