如何在R数据集中为二级设备添加对应一级父级值列
R 数据集新增父级设备列解决方案
示例数据预处理
你给出的示例通过cbind()生成的是字符矩阵,先转换为数据框更方便列操作:
equipment <- c("cleats","whistle","Football","Bat","Pink Ball","Cricket") level <- c(2,2,1,2,2,1) dt <- data.frame(equipment, level, stringsAsFactors = FALSE)
方法1:tidyverse 实现(推荐)
核心逻辑是先标记所有父级设备,再按顺序填充到子设备行:
library(dplyr) library(tidyr) dt_result <- dt %>% # 给level=1的父级行填充自身设备名,其余行留空 mutate(parent_equipment = ifelse(level == 1, equipment, NA_character_)) %>% # 填充空值:示例中父级在对应子级之后,用"up"向上填充;如果父级在子级之前,改为"down" fill(parent_equipment, .direction = "up") %>% # 可选操作:level=1的父级行不需要标注父级的话,设为空值 mutate(parent_equipment = ifelse(level == 1, NA_character_, parent_equipment))
方法2:base R 实现(无需安装第三方包)
# 提取所有level=1的父级位置和对应名称 parent_idx <- which(dt$level == 1) parent_names <- dt$equipment[parent_idx] # 匹配每行对应的父级设备 dt$parent_equipment <- parent_names[findInterval(seq(nrow(dt)), parent_idx, left.open = TRUE) + 1] # 可选操作:level=1的父级行父级设为空值 dt$parent_equipment[dt$level == 1] <- NA_character_
结果说明
最终输出的数据集会新增parent_equipment列,匹配规则和示例结果对应:
- cleats、whistle的父级为Football
- Bat、Pink Ball的父级为Cricket
- 两个level1的父级设备默认留空,可根据需求调整为保留自身名称。
内容的提问来源于stack exchange,提问作者Din
相关产品推荐
相关产品推荐

