список со строковыми векторами произвольной длины (но как минимум одним значением) внутри. Например такой:
list(i1 = c("a", "b"),
i2 = c("a", "c", "d"),
i3 = c("c", "d", "e"),
i4 = c("g"))
$i1 [1] "a" "b" $i2 [1] "a" "c" "d" $i3 [1] "c" "d" "e" $i4 [1] "g"
Я хочу сделать попарное сравнение этих векторов с помощью функции intersect(), чтобы посмотреть, какие значения совпадают для каждой пары значений.
На выходе я хочу получить что-то вот такое, результат сравнения в виде матрицы:
library(tidyverse)
matrix(c(NA, "a", "a", NA, "a", NA, "c, d", NA, "a", "c, d", rep(NA, 6)), 4) %>%
`colnames<-`(paste0("i", 1:4)) %>%
`row.names<-`(paste0("i", 1:4))
i1 i2 i3 i4
i1 NA "a" "a" NA
i2 "a" NA "c, d" NA
i3 "a" "c, d" NA NA
i4 NA NA NA NA
поскольку матрица требует плоских данных внутри, то вектор пересечений можно соединить в одно значение с разделителем запятой. Ну и что делать с диагоналями — некритично.
Что уже попробовал: есть очень близкая по смыслу функция base::outer(). Она практически решает задачу, но принимает в себя только вектора/матрицы/массивы, а не списки. Посмотрел разные штуки в {purrr}, там есть cross(), который является этаким аналогом base::expand.grid(), пока что самое близкое, но нужно из этого выковыривать попарные сравнения. Есть какие-нибудь идеи? Может, я что-то пропустил?
сам себе отвечу. Нашел архивированный пакет {rmngb} с функцией outerList(). Пакета на CRAN больше нет, но на гитхабе я нашел код самой функции: outerList <- function(X, Y, FUN, ...) { nX <- length(X) nY <- length(Y) x <- rep(X, nY) y <- rep(Y, each = nX) res <- mapply(FUN, x, y, ...) matrix(res, nrow = nX, dimnames = list(names(X), name```s(Y))) } Как-то я не ожидал, что это будет так коротко и просто. Ну и дальше можно li <- list(i1 = c("a", "b"), i2 = c("a", "c", "d"), i3 = c("c", "d", "e"), i4 = c("g")) outerList(li, li, intersect) i1 i2 i3 i4 i1 Character,2 "a" Character,0 Character,0 i2 "a" Character,3 Character,2 Character,0 i3 Character,0 Character,2 Character,3 Character,0 i4 Character,0 Character,0 Character,0 "g"
Обсуждают сегодня