基于Year&CompanyID分组筛选符合董事替换条件的R数据行
解决方法
首先加载dplyr包(未安装的话先运行install.packages("dplyr")),然后用以下代码处理你的数据:
library(dplyr) # 原始数据 df <- structure(list(Year = c(2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2006, 2006, 2006, 2006, 2006, 2006, 2006), CompanyID = c(5, 5, 5, 6, 6, 7, 7, 7, 5, 5, 5, 6, 6, 7, 7), Age = c(55, 48, 62, 62, 41, 62, 55, 63, 55, 48, 62, 62, 41, 62, 55), Gender = c("M", "M", "F", "M", "F", "M", "F", "M", "F", "M", "F", "F", "F", "M", "F"), JOIN = c(1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1), LEAVE = c(0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -15L)) # 筛选符合条件的行 result <- df %>% group_by(Year, CompanyID) %>% mutate( # 统计组内女性入职人数 female_join = sum(Gender == "F" & JOIN == 1), # 统计组内男性离职人数 male_leave = sum(Gender == "M" & LEAVE == 1), # 统计组内年龄>60的离职男性人数 male_leave_over60 = sum(Gender == "M" & LEAVE == 1 & Age > 60) ) %>% # 筛选出符合条件的组:1位女性入职、1位男性离职且该男性年龄>60 filter(female_join == 1 & male_leave == 1 & male_leave_over60 == 1) %>% # 只保留对应的入职女性和离职男性行 filter((Gender == "F" & JOIN == 1) | (Gender == "M" & LEAVE == 1 & Age > 60)) %>% # 移除临时计算的列 select(-female_join, -male_leave, -male_leave_over60) %>% ungroup() # 查看结果 result
代码逻辑说明
- 分组计算:按
Year和CompanyID分组后,分别统计每组内符合条件的女性入职人数、男性离职人数,以及年龄超过60的离职男性人数。 - 组筛选:只保留那些恰好有1位女性入职、1位男性离职,且该离职男性年龄超过60的组。
- 行筛选:在符合条件的组中,仅保留入职女性和年龄超60的离职男性这两类行。
- 清理数据:移除临时计算的辅助列并取消分组。
预期输出
运行上述代码后,得到的结果与预期一致:
# A tibble: 4 × 6 Year CompanyID Age Gender JOIN LEAVE <dbl> <dbl> <dbl> <chr> <dbl> <dbl> 1 2005 6 62 M 0 1 2 2005 6 41 F 1 0 3 2006 7 62 M 0 1 4 2006 7 55 F 1 0
内容的提问来源于stack exchange,提问作者Sharif
相关产品推荐
相关产品推荐

