R中如何不使用循环/自定义函数/第三方包按Run分组去除conc列重复值
问题原因
你之前运行的DNase[!duplicated(DNase$conc),]是对全数据集的conc列做全局维度的重复值判断,由于DNase数据集中所有Run对应的浓度梯度是完全一致的,全局去重时每个conc值只会保留全表第一次出现的行——这些行全部属于Run=1的分组,后续Run下的相同conc值都会被判定为重复值剔除,最终就只会返回Run1的去重结果。
实现方法
不需要用for循环、不需要自定义函数、不需要加载任何第三方包,直接利用base R中duplicated()支持多列组合判断重复的特性,将分组列(Run)和去重列(conc)同时传入做重复判定,即可实现每个Run分组内的conc去重:
# 按Run分组,组内对conc去重,保留每个conc首次出现的对应记录 DNase_dedup <- DNase[!duplicated(DNase[, c("Run", "conc")]), ]
结果校验
运行后可以通过两个简单操作验证结果正确性:
- 运行
nrow(DNase_dedup),返回值为88:原数据集共11个Run,每个Run对应8个唯一浓度值,11*8=88,符合预期行数 - 运行
any(duplicated(DNase_dedup[, c("Run", "conc")])),返回值为FALSE,证明不存在同Run下的重复conc值
这个写法不需要拆分数据集为列表、不需要用apply系列函数做组级遍历,本质是通过「Run+conc」的联合唯一键筛选非重复记录,完全匹配你的约束要求。
内容的提问来源于stack exchange,提问作者Jeremiah Mushtaq
相关产品推荐
相关产品推荐

