R语言如何在数据框中按分组筛选最接近0(排除0)的正负数值
R按分组筛选最接近0的非0距离行解决方案
你的代码存在两处逻辑问题:
- 比较维度不匹配:
min(abs(distance))返回的是绝对值的正数结果,直接和带正负的原始distance做相等判断,会过滤掉所有符合条件的负数值,比如gene1组的-5,绝对值是5为最小值,但-5≠5导致被误删 - 最小值计算未排除0:如果分组内存在distance=0的行,
min(abs(distance))结果为0,后续distance == 0 & distance != 0的矛盾条件会导致该组无结果返回,比如你的gene2组就会被完全过滤
修复方案1 调整filter逻辑
library(dplyr) distances <- f %>% group_by(gene) %>% # 先排除0值再计算绝对值最小值,再用原始值的绝对值和该最小值匹配 filter(abs(distance) == min(abs(distance[distance != 0]))) %>% ungroup()
修复方案2 用slice_min简化写法
distances <- f %>% filter(distance != 0) %>% # 提前过滤所有0值,减少分组计算量 group_by(gene) %>% slice_min(order_by = abs(distance), n = 1) %>% # 取每组绝对值最小的1行 ungroup()
两种方案运行后均可得到你期望的结果:
gene distance 1 gene1 -5 2 gene2 40 3 gene3 5
如果分组内存在多个绝对值相同的最接近0的值(比如某组同时有3和-3),可以在slice_min中添加参数with_ties = FALSE只保留第一个匹配行。
内容的提问来源于stack exchange,提问作者lana
相关产品推荐
相关产品推荐

