如何解决两次pivot_longer操作中的名称修复策略相关错误?
解决pivot_longer列名重复错误及多列块转长格式的实现
一、修复列名重复的错误
你两次调用pivot_longer时,默认都会生成名为name的列,第二次调用后出现重复列名,触发了"Names must be unique"错误。最直接的解决方式是第二次调用时手动指定names_to参数,给新的列名(比如var2),避免和第一次生成的列名重复:
mtcars %>% pivot_longer(1:3, values_to = 'values', names_to = 'var1') %>% pivot_longer(6:7, values_to = 'values1', names_to = 'var2')
如果不想手动命名,也可以用names_repair参数让系统自动修复重复列名(会给重复列名添加后缀):
mtcars %>% pivot_longer(1:3, values_to = 'values') %>% pivot_longer(6:7, values_to = 'values1', names_repair = "unique")
二、单次pivot_longer调用完成多列块转换
可以实现,但写法不如两次调用直观。如果你希望将两个列块的转换结果按组合展开(每个原始行生成3×2=6行),可以先为不同列块的列添加分组前缀,再用pivot_longer一次性转换:
mtcars %>% # 给第一列块(1-3列)、第二列块(6-7列)分别添加前缀 rename_with(~paste0("values_", .), 1:3) %>% rename_with(~paste0("values1_", .), 6:7) %>% # 按前缀拆分列名,生成值列和名称列 pivot_longer( cols = starts_with(c("values_", "values1_")), names_to = c(".value", "name"), names_sep = "_" ) %>% # 过滤掉无意义的NA行 filter(!is.na(values) | !is.na(values1))
不过这种方式需要额外处理列名,可读性不如两次调用的写法。如果追求代码简洁清晰,更推荐用第一次提到的两次调用方案。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

