сравнить общие значения в списке с неравными элементами подсписка - PullRequest
1 голос
/ 24 октября 2019

У меня есть такой тиббл:

library(tidyverse)

df <- tibble(
    id = 1:3,
    names = c("George G|Nick N", "Nick N|Andrian A", "Era E")

)

Столбец names имеет неодинаковую длину имен.

Я хочу извлечь эти имена и сравнить, если есть какие-либо общие имена.

Извлечение:

df_names <- (lapply(df$names, function(x) {strsplit(x, split="|", fixed = TRUE)}))

Теперь я не уверен, как перейти к сравнению.

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

maxlength <- max(sapply(df_names, length))
lapply(seq(maxlength),function(i) Reduce(intersect, lapply(df_names,"[[",i)))

но возвращает пустой список символов.

Под общими именами я имею в виду, как мы видим, df_names[[1]] и df_names[[2]] имеют общее имя Nick N.

Тогда я могуНапример, сгруппируйте по идентификатору и заговорите против общих имен, чтобы увидеть, какие идентификаторы имеют общие имена.

Пример графика:

plot

1 Ответ

0 голосов
/ 24 октября 2019

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

Например:

library(proxy)
df <- df %>% mutate(sep_names = strsplit(names, split="|", fixed = TRUE))

res <- proxy::dist(df$sep_names, method = function(x, y) any(x %in% y))

# Convert to matrix and assign ids
res <- as.matrix(res)
colnames(res) <- df$id
rownames(res) <- df$id

# > res == 1
#       1     2     3
# 1 FALSE  TRUE FALSE
# 2  TRUE FALSE FALSE
# 3 FALSE FALSE FALSE

Что касается построения, вы можете начать с этого:

library(reshape2)
ggplot(melt(res == 1), aes(Var1,Var2, fill=value)) +
    geom_raster() +
    scale_fill_discrete() +
    xlab("id") + ylab("id")
...