R中基于列值新增行:为仅存SMA类型的PPCODE补充LAR类型行
R语言dplyr实现PPCODE类型补全方案
实现思路
- 按
PPCODE字段分组,筛选出存在SMA类型记录、但不存在LAR类型记录的分组 - 对符合条件的分组去重,每个PPCODE仅生成1条待补充的记录
- 修改待补充记录的指定字段:
SHOPID设为NA、TYPE设为"LAR",其余字段保留原有取值 - 将生成的补充记录合并到原数据集末尾
完整实现代码
# 加载依赖库 library(dplyr) # 加载示例数据集(可替换为你的真实数据集) df <- structure(list(SHOPID = c("11T", "2T1", "33A", "14B", "29O"), PPCODE = c(4412, 3567, 4412, 3567, 5123), PRICE = c(1.45, 1.21, 1.45, 1.21, 1.01), TYPE = c("LAR", "SMA", "SMA", "SMA", "LAR")), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame")) # 生成需要补充的LAR类型记录 new_rows <- df %>% group_by(PPCODE) %>% # 筛选满足条件的PPCODE分组 filter(any(TYPE == "SMA") & !any(TYPE == "LAR")) %>% # 同一个PPCODE去重,仅保留1条记录生成补全行 distinct(PPCODE, PRICE, .keep_all = TRUE) %>% ungroup() %>% mutate( # 适配SHOPID的字符类型,避免类型报错 SHOPID = NA_character_, TYPE = "LAR" ) # 合并补全行到原数据集,得到最终结果 result <- bind_rows(df, new_rows)
适配说明
- 该方案为通用逻辑,可直接适配任意规模的数据集,所有符合条件的PPCODE都会自动生成补全行
- 如果实际业务中同一个PPCODE对应的SMA记录存在PRICE取值不一致的情况,可调整去重逻辑,比如用
summarise(PRICE = mean(PRICE))等方式统一PRICE取值即可
内容的提问来源于stack exchange,提问作者Adolf Miszka
相关产品推荐
相关产品推荐

