使用tidyr::pivot_longer()遇重复名错误,无明显重复列名
解决pivot_longer列名重复报错及99999值替换问题
报错原因
你的数据框as中已存在名为name或value的列,而tidyr::pivot_longer默认会生成这两个列名,导致列名重复冲突,触发报错。
解决方案及修正代码
核心调整点
- 为
pivot_longer指定自定义列名,避免与原数据框列名冲突 - 使用正则表达式精确匹配目标列(AS1_WEIGHT至AS9_WEIGHT)
- 优化替换逻辑,处理首尾列的99999值(可选)
修正后的代码
# 验证报错原因:检查原数据框是否存在name/value列 any(c("name", "value") %in% colnames(as)) # 执行替换操作的完整代码 as %<>% mutate(row = row_number()) %>% tidyr::pivot_longer( cols = matches("^AS\\d+_WEIGHT$"), # 精确匹配目标列 names_to = "weight_col", # 自定义列名,避免冲突 values_to = "weight_val" ) %>% mutate( weight_val = if_else( weight_val == 99999, # 若为字符型则改为weight_val == '99999' # 优先用同一行下一列的值,无有效值则用前一列 coalesce(lead(weight_val), lag(weight_val)), weight_val ), .by = row ) %>% tidyr::pivot_wider( names_from = weight_col, values_from = weight_val ) %>% select(-row) # 移除临时生成的row列
关键说明
- 精确列匹配:
matches("^AS\\d+_WEIGHT$")通过正则表达式精准筛选以AS开头、中间为数字、结尾为_WEIGHT的列,避免误选其他无关列 - 列名冲突解决:通过
names_to和values_to指定自定义列名,彻底避免与原数据框的name/value列重名 - 完善替换逻辑:使用
coalesce(lead(weight_val), lag(weight_val)),当当前值为99999时,优先取同一行的下一列值;若下一列无有效值(如最后一列),则取前一列值,覆盖更多场景
内容的提问来源于stack exchange,提问作者HJ WHY
相关产品推荐
相关产品推荐

