r - 将精确值与跨列的许多有效数字进行比较
问题描述
我有一张包含许多不同有效数字的数字表。我需要跨列找到这些数字的完全匹配 - 例如
find_mz_matches <- data.frame("mz1" = c(3.14222, 314.12003, 214.220,
254.111223, NA, NA, NA, NA, NA), "mz2" = c(3.14222, 456.2200001, NA,
NA, NA, NA, NA, NA, NA), "mz3" = c(300.112223, 456.2200001, 3.14222,
254.111223, 900.232, 476.0012503, 459.00201, 500.60402, 300.4053102))
我想知道 mz1 和 mz2、mz2 和 mz3 之间以及最后在所有三列之间共享哪些值。
因此,比较 mz1 和 mz2 应该得出:
mz1_v_mz2
3.14222
456.2200001
并比较所有三个:
mz_all
3.14222
我拼凑了一些几乎可以工作的东西,但问题是它在某处四舍五入,我的输出包括相似但不相同的数字,例如 3.14222 不应该与 3.14223 匹配。它还在输出中包含 NA,这是不需要的。
duplicates_across1 <- find_mz_matches[find_mz_matches$mz1
%in% find_mz_matches$mz2, ]
这应该可以比较前两列,所以我想我只需要输出并再次进行下一次比较 - 将duplicates_across1的输出与find_mz_matches$mz3进行比较。出于某种原因,它没有在所有三列之间捕捉到 3.14222 的存在,我不知道为什么。
duplicates_all <- duplicates_across1[duplicates_across1$mz1
%in% find_mz_matches$mz3, ]
解决方案
见Reduce()
:
Reduce(intersect, find_mz_matches, accumulate = T)
Reduce(intersect, find_mz_matches, accumulate = T, right = T)
该参数accumulate
是可选的 - 它只是为了向您展示正在发生的事情。为了您的使用,您可以将其取出,它会导致 3.14222。
Reduce(intersect, find_mz_matches)
[1] 3.14222
推荐阅读
- google-chrome - 在浏览器上正好 2 分钟后,空闲的 websocket 连接在 AKS 上断开
- windows - 如何为 sysvad 或其他真实麦克风启用交换/延迟/kws apo
- php - 我如何在 laravel 中分页数据?
- linux - VLC - 获取播放文件路径
- c# - 如何在 Program 类中/从 Program 类中访问 DbContext?
- monday.com - 如何在星期一使用其 API 查询多个板?
- jquery - 如何使用 jQuery 或 JavaScript 减少 html 标签内的值?
- sql - 从子句未加入 3 个类似,但适用于 2
- c - 如何在C中忽略txt文件的特定部分
- fullcalendar - Fullcalendar visibleRange 不适用于资源日网格