169 похожих чатов

Всем привет, вот представим такую задачу. На входе есть плоский

список со строковыми векторами произвольной длины (но как минимум одним значением) внутри. Например такой:


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(), пока что самое близкое, но нужно из этого выковыривать попарные сравнения. Есть какие-нибудь идеи? Может, я что-то пропустил?

1 ответов

23 просмотра
Ivan-Pozdniakov Автор вопроса

сам себе отвечу. Нашел архивированный пакет {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"

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта