如何在R中基于列内其他单元格信息为单元格添加层级归属标识?
高效给数据框分配层级标签的R方案
嘿,手动处理500多行确实太折磨人了!我刚好处理过类似的结构化数据,用R几行代码就能自动识别每个行所属的层级,完全不用手动改。
先理清楚你的数据规律:每个层级的最后一行是带"total"的汇总行,比如Level A total是A层级的收尾,上面的行都属于A;Level B total是B层级的收尾,它到上一个汇总行之间的行属于B。基于这个规律,我们可以用两种方法实现:
方法一:用tidyverse工具(直观易读)
如果你平时用dplyr和tidyr这类包,这个方法最省心:
# 加载必要的包 library(tidyverse) # 你的原始数据 df <- data.frame(Job = c("casual", "part time", "full time", "Level A total" , "casual","full time","Level B total"), institute1 = c(1,2,2,5,0,1,1)) # 自动生成层级标签 df_processed <- df %>% # 第一步:给汇总行标记对应的层级(比如从"Level A total"提取"Level A") mutate(level = ifelse(str_detect(Job, "total"), str_extract(Job, "Level [A-Z]"), NA)) %>% # 第二步:从汇总行向上填充层级值,让上面的行都继承该层级 fill(level, .direction = "up") %>% # 可选:如果不需要汇总行,就过滤掉;需要的话删掉这行 filter(!str_detect(Job, "total")) # 查看结果 print(df_processed)
运行后你会得到每个行对应的level列,完全符合你的需求。
方法二:Base R实现(不用额外装包)
如果不想加载tidyverse,用原生R代码也能搞定:
# 你的原始数据 df <- data.frame(Job = c("casual", "part time", "full time", "Level A total" , "casual","full time","Level B total"), institute1 = c(1,2,2,5,0,1,1)) # 初始化层级列 df$level <- NA # 找到所有汇总行的位置 total_rows <- grep("total", df$Job) # 提取每个汇总行对应的层级名称(去掉" total"后缀) levels <- sub(" total", "", df$Job[total_rows]) # 循环给每个层级区间赋值 for(i in seq_along(total_rows)){ # 确定当前层级的起始行:第一个层级从第1行开始,后续层级从上一个汇总行的下一行开始 start_row <- ifelse(i == 1, 1, total_rows[i-1] + 1) # 确定当前层级的结束行:当前汇总行的前一行 end_row <- total_rows[i] - 1 # 给这个区间的行赋值层级 df$level[start_row:end_row] <- levels[i] } # 可选:过滤掉汇总行 df_processed <- df[-total_rows, ] # 查看结果 print(df_processed)
这两种方法都能自动适配任意数量的层级,哪怕你的500多行里有Level C、Level D这类汇总行,也能准确划分每个行的所属层级,彻底告别手动清洗!
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

