在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
相关产品推荐
相关产品推荐

