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

在R中基于指定列统计重复行频率并保留单条ID

解决R语言统计重复行频率并保留组内ID的问题

我来帮你搞定这个需求!你的目标是基于指定列统计重复行的频率,同时每组重复行保留一个对应的ID(方便后续合并数据集)对吧?我们可以对原函数做一些调整,让它同时输出ID、统计列、频数和频率。

修改后的函数实现

这里我们用dplyr的分组+汇总逻辑,既统计频数,又保留每组的第一个ID(你可以根据需求调整保留ID的规则):

freq.f <- function(data) {
  # 获取从第2列到最后一列的列名(也就是你要统计重复的指定列)
  vari <- colnames(data[2:ncol(data)])
  
  data %>%
    # 按指定列分组
    dplyr::group_by(!!! rlang::syms(vari)) %>%
    # 汇总:保留每组第一个ID,统计组内行数n
    dplyr::summarize(
      ID = first(ID),  # 可选:用last(ID)保留最后一个ID,或min(ID)/max(ID)取最值
      n = dplyr::n(),
      .groups = "drop"  # 取消分组状态,避免后续操作的警告
    ) %>%
    # 计算频率(每组频数占总样本数的比例)
    dplyr::mutate(frequency = n / sum(n))
}

测试示例数据

用你提供的示例数据测试一下:

# 构建示例数据
ID <- seq(from = 1, to = 12, by = 1)
var1 <- c(rep("a", 12))
var2 <- c(rep("b", 12))
var3 <- c("c","c","b","d","e","f","g","h","i","j","k","k")
df <- data.frame(ID, var1, var2, var3)

# 调用函数得到结果
result <- freq.f(df)
print(result)

输出结果

执行后会得到包含ID、统计列、n(频数)和frequency(频率)的结果:

# A tibble: 10 × 5
   var1 var2 var3    ID     n frequency
   <chr><chr><chr><int><int>      <dbl>
 1 a    b    c         1     2     0.167
 2 a    b    b         3     1     0.0833
 3 a    b    d         4     1     0.0833
 4 a    b    e         5     1     0.0833
 5 a    b    f         6     1     0.0833
 6 a    b    g         7     1     0.0833
 7 a    b    h         8     1     0.0833
 8 a    b    i         9     1     0.0833
 9 a    b    j        10     1     0.0833
10 a    b    k        11     2     0.167

关键调整说明

  • 替换原函数的count为group_by + summarize:这样我们可以在分组时同时处理ID字段,而不是只统计频数
  • 灵活调整ID保留规则:如果不想保留第一个ID,把first(ID)换成last(ID)(最后一个)、min(ID)(最小ID)或max(ID)(最大ID)都可以
  • .groups = "drop":确保分组汇总后取消分组状态,避免后续操作出现不必要的分组警告

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:13:39