在R中生成含唯一机构的数据集,处理重复元素优先级
嘿,我来帮你搞定这个问题!你想要从包含重复机构的数据框里生成每个机构仅出现一次的新数据框,同时还要按优先级筛选对应行对吧?咱们一步步来解决:
解决思路:按优先级筛选唯一机构数据框
首先得明确优先级规则,这里我假设你对OrgType的优先级排序是:Government > Education > Consulting(你可以根据实际需求随时调整这个顺序)。下面提供两种实现方法,你可以根据习惯选择:
方法1:使用dplyr包(推荐,代码更直观清晰)
如果还没安装dplyr,先完成安装加载:
install.packages("dplyr") library(dplyr)
接下来我们给OrgType设置优先级,排序后按机构分组取优先级最高的行:
# 定义OrgType的优先级顺序 priority_order <- factor(c("Government", "Education", "Consulting"), levels = c("Government", "Education", "Consulting"), ordered = TRUE) # 处理数据:按机构分组,先按优先级从高到低排序,再取每组第一行 df_unique <- df %>% mutate(OrgType = factor(OrgType, levels = levels(priority_order), ordered = TRUE)) %>% arrange(OrgName, desc(OrgType)) %>% group_by(OrgName) %>% slice(1) %>% # 提取每组优先级最高的那一行 ungroup() %>% select(names(df)) # 保持原数据框的列顺序 # 查看最终结果 df_unique
运行后输出的结果会是:
OrgName ProgramName OrgType 1 Org1 P1 Consulting 2 Org2 P1 Government 3 Org3 P2 Government
方法2:使用Base R实现(无需额外安装包)
如果你不想依赖第三方包,可以用原生R代码完成:
# 定义优先级顺序 priority_levels <- c("Government", "Education", "Consulting") # 给每个OrgType匹配对应的优先级分数(分数越高优先级越高) df$priority_score <- match(df$OrgType, priority_levels) # 按机构分组,筛选出每组优先级分数最高的行(若有多个同优先级行,取第一个) df_unique_base <- do.call(rbind, lapply(split(df, df$OrgName), function(x) { x[which.max(x$priority_score), ] })) # 移除临时添加的优先级分数列 df_unique_base <- df_unique_base[, names(df)] # 查看结果 df_unique_base
额外扩展:合并同机构的多个项目
如果同一机构同一优先级下有多个ProgramName,你可以选择合并这些项目而不是只保留第一个,代码可以改成这样:
df_unique_combined <- df %>% mutate(OrgType = factor(OrgType, levels = levels(priority_order), ordered = TRUE)) %>% arrange(OrgName, desc(OrgType)) %>% group_by(OrgName) %>% summarise( ProgramName = paste(unique(ProgramName), collapse = ", "), OrgType = first(OrgType) ) %>% ungroup()
这样输出的ProgramName会是该机构所有高优先级项目的集合。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

