Сравнение точных значений со многими значащими цифрами в столбцах - PullRequest
1 голос
/ 03 июля 2019

У меня есть таблица чисел со многими, различающимися значащими цифрами.Мне нужно найти точные совпадения для этих цифр по столбцам - например,

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, ]

Ответы [ 3 ]

1 голос
/ 03 июля 2019

См. 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 голос
/ 03 июля 2019

Вот очень lapply -й ответ, который сравнивает каждую комбинацию и сохраняет результаты в списке. Он должен быть гибким, если у вас более 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
0 голосов
/ 03 июля 2019

Я бы сделал что-то вроде:

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)

После этого я бы объединил полученные столбцы, если нет конфликта.

...