如何删除DataFrame中第一列首单词为小写的重复行?
解决方法:删除DataFrame中首单词小写的重复行
假设你的DataFrame结构类似这样(示例数据):
df <- data.frame( a = c("apple pie", "Apple pie", "banana bread", "Banana bread", "cherry tart"), b = c(1, 1, 2, 2, 3), c = c("x", "x", "y", "y", "z"), stringsAsFactors = FALSE )
核心思路
- 生成标准化分组键:把第一列的首单词首字母统一转为大写,让大小写不同但内容一致的行归为同一组。
- 分组筛选:在每个重复组内,只保留首单词首字母大写的行;如果某行没有对应的大小写重复(组内仅一行),则保留该行。
使用dplyr实现(推荐)
library(dplyr) # 定义函数判断首单词首字母是否大写 is_first_upper <- function(x) { substr(x, 1, 1) == toupper(substr(x, 1, 1)) } # 处理数据 result_df <- df %>% # 生成标准化列:将首单词转成大写 mutate(standardized_a = sub("^(\\w+)", "\\U\\1", a, perl = TRUE)) %>% # 按标准化列+其他所有列分组(确保只归并真正的重复记录) group_by(standardized_a, across(-a)) %>% # 筛选规则:保留首字母大写的行,或组内仅一行的情况 filter(is_first_upper(a) | n() == 1) %>% ungroup() %>% # 删除辅助列 select(-standardized_a)
使用Base R实现
如果不想依赖dplyr,可以用原生R代码:
# 定义判断函数 is_first_upper <- function(x) { substr(x, 1, 1) == toupper(substr(x, 1, 1)) } # 生成标准化分组键 df$standardized_a <- sub("^(\\w+)", "\\U\\1", df$a, perl = TRUE) # 按标准化键+其他列分组 groups <- split(df, list(df$standardized_a, df[, -which(names(df) == "a")])) # 逐个组处理 processed_groups <- lapply(groups, function(group) { if (nrow(group) > 1) { # 组内有重复,只保留首字母大写的行 group[is_first_upper(group$a), ] } else { # 组内无重复,直接保留 group } }) # 合并结果并清理 result_df <- do.call(rbind, processed_groups) rownames(result_df) <- NULL result_df <- result_df[, -which(names(result_df) == "standardized_a")]
效果验证
处理后的result_df会去掉所有存在对应大写首单词的小写行,保留大写行和无重复的单行:
a b c 1 Apple pie 1 x 2 Banana bread 2 y 3 cherry tart 3 z
内容的提问来源于stack exchange,提问作者John H
相关产品推荐
相关产品推荐

