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

如何删除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
)

核心思路

  1. 生成标准化分组键:把第一列的首单词首字母统一转为大写,让大小写不同但内容一致的行归为同一组。
  2. 分组筛选:在每个重复组内,只保留首单词首字母大写的行;如果某行没有对应的大小写重复(组内仅一行),则保留该行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:28:33