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 ответов

21 просмотр
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"

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта