如何用dplyr移除R数据框中与对应paid列内容相同的written列
自动化移除重复的written列(dplyr实现)
针对你的需求,我们可以通过以下步骤自动筛选并移除与对应paid列完全一致的written列:
- 识别目标列:先找出所有以
.written结尾的列,再匹配它们对应的.paid列 - 对比列内容:检查每一组
前缀.paid和前缀.written是否完全相同 - 筛选保留列:保留所有非written列,加上那些和对应paid列内容不同的written列
完整代码实现
library(dplyr) library(purrr) # 用于逐组对比列内容 # 原始数据框 df <- data.frame(a.paid = c("A", "A", "B"), a.written = c("A", "A", "B"), b.paid = c(1, 3, 4), b.written = c(1, 3, 4), c.paid = c(1, 3, 5), c.written = c(2, 3, 5), t = c(1, 1, 1)) # 1. 提取所有written列和对应的paid列 written_cols <- grep("\\.written$", colnames(df), value = TRUE) prefixes <- sub("\\.written$", "", written_cols) paid_cols <- paste0(prefixes, ".paid") # 2. 判断哪些written列需要保留(和对应paid列内容不同) keep_written <- written_cols[!purrr::map2_lgl(paid_cols, written_cols, ~all(df[[.x]] == df[[.y]]))] # 3. 生成精简后的数据集 df_clean <- df %>% select(-ends_with(".written"), all_of(keep_written)) # 查看结果 print(df_clean)
结果验证
运行代码后会得到预期输出:
a.paid b.paid c.paid c.written t 1 A 1 1 2 1 2 A 3 3 3 1 3 B 4 5 5 1
代码说明
grep("\\.written$", ...):精准匹配以.written结尾的列名map2_lgl:逐组对比paid列和written列的所有元素是否完全一致,返回逻辑向量select(-ends_with(".written"), all_of(keep_written)):先移除所有written列,再把需要保留的written列重新加入
内容的提问来源于stack exchange,提问作者CodingCat
相关产品推荐
相关产品推荐

