基于分组添加标注:为R数据框新增rel_from列的实现需求
R语言分组处理data.frame,为Ind行添加rel_from标注
示例数据
先构造一个符合需求的测试数据集:
mydata <- data.frame( Name = c("Alice", "Alice", "Bob", "Bob", "Charlie", "Charlie", "Dave", "Dave", "Eve", "Eve", "Eve"), Dep = c("HR", "HR", "Eng", "Eng", "Fin", "Fin", "Ops", "Ops", "Mar", "Mar", "Mar"), Loc = c("NY", "NY", "LA", "LA", "Chicago", "Chicago", "Boston", "Boston", "Dallas", "Dallas", "Dallas"), rel = c("Ind", "Boss", "Ind", "Dir", "Ind", "Boss", "Ind", "Dir", "Ind", "Boss", "Dir") )
处理方案(使用dplyr)
利用dplyr的分组和条件判断功能实现需求,步骤如下:
- 加载dplyr包(未安装先运行
install.packages("dplyr"))
library(dplyr)
- 分组并添加rel_from列
mydata_processed <- mydata %>% # 按Name、Dep、Loc分组 group_by(Name, Dep, Loc) %>% # 根据分组内的rel值,为Ind行赋值rel_from mutate( rel_from = case_when( # 非Ind行设为NA rel != "Ind" ~ NA_character_, # 同时存在Boss和Dir → 标注Both "Boss" %in% rel & "Dir" %in% rel ~ "Both", # 仅存在Boss → 标注Boss "Boss" %in% rel ~ "Boss", # 仅存在Dir → 标注Dir "Dir" %in% rel ~ "Dir", # 兜底情况(理论上不会触发) TRUE ~ NA_character_ ) ) %>% # 取消分组 ungroup()
输出结果
运行上述代码后,得到的处理结果如下:
# A tibble: 11 × 5 Name Dep Loc rel rel_from <chr> <chr> <chr> <chr> <chr> 1 Alice HR NY Ind Boss 2 Alice HR NY Boss NA 3 Bob Eng LA Ind Dir 4 Bob Eng LA Dir NA 5 Charlie Fin Chicago Ind Boss 6 Charlie Fin Chicago Boss NA 7 Dave Ops Boston Ind Dir 8 Dave Ops Boston Dir NA 9 Eve Mar Dallas Ind Both 10 Eve Mar Dallas Boss NA 11 Eve Mar Dallas Dir NA
代码逻辑说明
group_by(Name, Dep, Loc):将数据按指定的三个列分组,确保每个组内是同一Name、Dep、Loc的记录case_when():按顺序判断条件,为rel_from赋值:- 首先排除非Ind行,设为NA
- 优先判断是否同时存在Boss和Dir,满足则标注"Both"
- 其次判断是否存在Boss,满足则标注"Boss"
- 最后判断是否存在Dir,满足则标注"Dir"
ungroup():处理完成后取消分组,恢复普通data.frame结构
内容的提问来源于stack exchange,提问作者akang
相关产品推荐
相关产品推荐

