如何将每个标记的可变数量的连接标记的列拆分为一列?

Tem*_*Rex 3 r stringr dplyr tidyr

请考虑以下数据:

library(tibble)

key <- c("a", "b", "c", "d", "e")
tags <- c("A,B", "B", "A,E", "C,D", "")
data <- tibble(key, tags)
Run Code Online (Sandbox Code Playgroud)

在这里,key可能意味着书名,tags可能是流派,或者key可能是电子邮件发件人,tags可能意味着收件人.必不可少的是,列tags可以具有变量(可能为零)个不同的子串.

为了拆分我可以使用的固定数量的连接标签(例如数据)tidyr::spread,我可以使用字符串拆分来分隔tags列本身,但如何将两者结合起来呢?

我希望转换后的数据看起来像这样:

key  A     B     C     D     E
a    TRUE  TRUE  FALSE FALSE FALSE
b    FALSE TRUE  FALSE FALSE FALSE
c    TRUE  FALSE FALSE FALSE TRUE
d    FALSE FALSE TRUE  TRUE  FALSE
e    FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

我可以看到通过拆分tags,确定唯一的子串并在每个子串上循环并测试tags每行是否包含字符串,可以分几步完成此操作.但是我更喜欢在使用tidyverse的管道中执行此操作.

问题:如何将每个标记的可变数量的连接标记拆分为一列?

tal*_*lat 5

这是一个基本的R替代方法:

# get unique values in tags
x <- unique(unlist(strsplit(df$tags, ",", fixed=TRUE)))
# check for existence in the tags column
res <- sapply(paste0("(^|.*,)", x, "(,.*|$)"), grepl, df$tags)
# add sensible dimension names
dimnames(res) <- list(df$key, x)
Run Code Online (Sandbox Code Playgroud)

结果矩阵如下所示:

res
#      A     B     E     C     D
#a  TRUE  TRUE FALSE FALSE FALSE
#b FALSE  TRUE FALSE FALSE FALSE
#c  TRUE FALSE  TRUE FALSE FALSE
#d FALSE FALSE FALSE  TRUE  TRUE
#e FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)