我有一个数字表,其中包含许多不同的有效数字。我需要跨列查找这些数字的确切匹配项-例如
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, ]
答案 0 :(得分:1)
请参见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
答案 1 :(得分:1)
这是一个非常lapply
-y的答案,它比较每个组合并将结果存储在列表中。如果您也有3列以上,则应该很灵活。祝你好运!
# Creating all combinations of columns in a list (and flattening it with unlist)
combos <- unlist(lapply(2:ncol(find_mz_matches), combn, x = find_mz_matches, simplify = F), recursive = F)
# Checking for common elements
common_elements <- lapply(combos, function(x) Reduce(base::intersect, x))
# Renaming the elements
names(common_elements) <- sapply(lapply(combos, names), paste, collapse = "_")
common_elements
$mz1_mz2
[1] 3.14222 NA
$mz1_mz3
[1] 3.14222 254.11122
$mz2_mz3
[1] 3.14222 456.22000
$mz1_mz2_mz3
[1] 3.14222
答案 2 :(得分:0)
我会做类似的事情:
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))
find_mz_matches$mz_allmz1mz2 <- ifelse(find_mz_matches$mz1 == find_mz_matches$mz2 ,find_mz_matches$mz1 , NA)
find_mz_matches$mz_allmz2mz3 <- ifelse(find_mz_matches$mz2 == find_mz_matches$mz3 ,find_mz_matches$mz2 , NA)
在那之后,如果不存在冲突,我将合并结果列。