嵌套tibble执行unnest操作前如何删除重复列名的列?
实现方案
你可以用以下代码实现drop_duplicated_cols函数,完全适配你要求的管道调用逻辑:
library(tidyverse) drop_duplicated_cols <- function(df, nest_col) { nest_col <- enquo(nest_col) outer_colnames <- colnames(df) df %>% mutate(!!nest_col := map(!!nest_col, ~ select(.x, -any_of(outer_colnames)))) }
调用测试
用你提供的测试数据验证:
# 构造测试数据 df <- tibble(id = 1:2, data = list(tibble(id = 1, var1 = "a", var2 = "b"), tibble(id = 2, var1 = "c", var2 = "d"))) # 按预期方式调用 df %>% drop_duplicated_cols(data) %>% unnest(data)
输出结果
# A tibble: 2 × 3 id var1 var2 <int> <chr> <chr> 1 1 a b 2 2 c d
逻辑说明
- 用
enquo()处理传入的嵌套列名,适配tidyverse的非标准评估规则,支持直接传入列名无需加引号 - 先提取外层tibble的所有列名,遍历嵌套列中的每个子tibble时,删除所有和外层重名的列
any_of()做安全校验,避免子tibble无对应重名列时抛出错误
内容的提问来源于stack exchange,提问作者MartenMM
相关产品推荐
相关产品推荐

