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

R语言如何对dataframe去重并新增列统计各行重复出现次数

R去除数据框重复行并统计重复次数实现方案

首先构造你给出的示例测试数据,方便复现验证:

# 构造示例数据框
df <- data.frame(
  header1 = c("tuna", "orange", "orange", "blue", "orange", "tuna"),
  header2 = c("apple", "salmon", "trout", "trout", "salmon", "apple")
)

不需要自己写while循环逐行判断,R内置函数和常用数据处理包都有现成的高效实现,下面给两种最常用的方案,运行后直接得到你要的输出结构。


方案1:Base R 原生实现(无需安装任何第三方包)

直接用内置的aggregate分组统计函数,按所有列分组后统计每组行数即可,代码如下:

result <- aggregate(
  x = list(`NEW: Number of Occurances` = rep(1, nrow(df))),
  by = df,
  FUN = sum
)

运行后输出的result和你给出的预期结果完全一致。

如果你想结合之前尝试的duplicated逻辑实现,也可以先取所有唯一行再逐行匹配计数,小数据集下完全可用:

# 先提取所有不重复的行
unique_df <- unique(df)
# 逐行统计每个唯一行组合在原数据中出现的次数
unique_df$`NEW: Number of Occurances` <- apply(
  unique_df, 1,
  function(current_row) sum(apply(df, 1, function(ori_row) all(ori_row == current_row)))
)

你之前写循环判断出错的核心原因就在这里:直接用df[countx,] == df[county,]比较两行时,R会返回「每一列是否相等」的布尔向量,而if语句只能识别单个布尔值,会默认取向量第一个元素做判断,才会出现“只要第一列值相等就判定整行重复”的问题。只要在外层套一个all()函数,判断所有列的比较结果都为TRUE,才是真正的整行完全匹配。


方案2:dplyr包实现(代码简洁,适合大数据量场景)

如果你的数据量比较大,或者平时做数据处理常用tidyverse系列工具,用dplyr的分组计数写法更直观易读,不管数据框有多少列都不需要手动写列名:
如果没安装过dplyr,先运行一次安装命令:install.packages("dplyr"),之后运行以下代码:

library(dplyr)

result <- df %>%
  group_by(across(everything())) %>% # 自动按数据框所有列分组
  summarise(`NEW: Number of Occurances` = n(), .groups = "drop")

输出结果和预期完全一致,数据量越大运行速度优势越明显。


注意:不推荐自己手写while/for循环做逐行匹配判断,当数据行数达到上万级时,循环的运行效率会远低于上述两种内置向量化实现。

内容的提问来源于stack exchange,提问作者Alec Max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:21:19