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的管道中执行此操作.
问题:如何将每个标记的可变数量的连接标记拆分为一列?
这是一个基本的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)