You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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列

关键说明

  1. 精确列匹配:matches("^AS\\d+_WEIGHT$")通过正则表达式精准筛选以AS开头、中间为数字、结尾为_WEIGHT的列,避免误选其他无关列
  2. 列名冲突解决:通过names_to和values_to指定自定义列名,彻底避免与原数据框的name/value列重名
  3. 完善替换逻辑:使用coalesce(lead(weight_val), lag(weight_val)),当当前值为99999时,优先取同一行的下一列值;若下一列无有效值(如最后一列),则取前一列值,覆盖更多场景

内容的提问来源于stack exchange,提问作者HJ WHY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:05:10