我有字符串向量需要以某种方式在矩阵中拆分和重新排列。我知道怎么做分裂/简单的重新排列,但是失去了重新排列我想要的方式:
library(stringi)
vec = c("b;a;c","a;c","c;b")
q = stri_split_fixed(vec, ";", simplify = TRUE,fill=T)
View(q)
V1 V2 V3
b a c
a c
c b
期望的输出
V1 V2 V3
a b c
a c
b c
谢谢! 编辑:
以上信件是为了简单起见。真实选项(非详尽列表):D-Amazon Marketplace
,U-Amazon
,D-Amazon
,U-Jet
等。仅以U
和D
开头,虽然。
订单 - 按字母顺序排列,但按零售商分组。如果太复杂 - 没有订单可以
答案 0 :(得分:2)
此解决方案生成一个布尔矩阵,每个向量作为一行,每个可能的字符作为列。
possible_options = c('a', 'b', 'c')
result <- sapply(possible_options, function(x) apply(q, 1, function(y) x %in% y))
result
a b c
[1,] TRUE TRUE TRUE
[2,] TRUE FALSE TRUE
[3,] FALSE TRUE TRUE
此解决方案需要所有选项的列表。如果没有,可以列出所有可能的选项(例如所有字母数字字符),然后删除空白行:
result <- sapply(c(letters, LETTERS), function(x) apply(q, 1, function(y) x %in% y))
result <- result[, colSums(result) > 0]
result
a b c
[1,] TRUE TRUE TRUE
[2,] TRUE FALSE TRUE
[3,] FALSE TRUE TRUE
或者从q
opts <- as.character(unique(unlist(q)))
opts <- opts[sort.list(opts[opts != ''])]
result <- sapply(opts , function(x) apply(q, 1, function(y) x %in% y))
result
a b c
[1,] TRUE TRUE TRUE
[2,] TRUE FALSE TRUE
[3,] FALSE TRUE TRUE