Подмножество вектора по значению и соответствующему имени - PullRequest
1 голос
/ 25 марта 2020

У меня есть два названных вектора. Первый (foo) - это вектор поиска. Второй (bar) содержит значения, которые генерируются при каждом запуске симуляции. В прогоне bar может не совпадать с длиной foo и возвращать разные значения для одного и того же имени и в произвольном порядке; следовательно, два значения для b и z и a находятся в позициях 1 и 4 соответственно.

Как можно одно подмножество bar, чтобы оно возвращало значения не в foo с соответствующими именами? Желаемый результат можно увидеть с помощью bar2.

foo <- c(a = 5, b = 5, c = 5, d = 4, e = 5, z = 5) # lookup vector
bar <- c(z = 5, b = 4, b = 3, a = 5, e = 2)        # data

bar2 <- c(b = 4, b = 3, e = 2)                     # desired output

> bar2
b b e 
4 3 2 

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Вы можете объединить имена и значения:

bar[!paste0(bar, names(bar)) %in% paste0(foo, names(foo))]

#b b e 
#4 3 2 
1 голос
/ 25 марта 2020

В одну сторону, используя mapply:

bar[mapply(function(x, y) !any(names(foo) %in% x & foo %in% y), names(bar), bar)]

#b b e 
#4 3 2 

Аналогичные логики c с purrr 's imap_lgl.

bar[purrr::imap_lgl(bar, ~!any(foo %in% .x & names(foo) %in% .y))]
...