【问题标题】:R: split string vector by delimiter and rearrangeR:通过分隔符拆分字符串向量并重新排列
【发布时间】:2018-05-17 18:11:10
【问题描述】:

我有一个字符串向量,需要以某种方式在矩阵中拆分和重新排列。我知道如何进行拆分/简单重新排列,但失去了如何重新排列我想要的方式:

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 MarketplaceU-AmazonD-AmazonU-Jet 等。不过,仅以 UD 开头。

订单 - 按字母顺序排列,但按零售商分组。如果太复杂 - 没有订单是可以的

【问题讨论】:

  • 你能一直假设第一行将包含所有因素/字母吗?
  • 没有。任意长度
  • 你知道一共有多少种选择吗?或者,顺序是否重要,还是只需要对同一列中相同的字符进行分组?
  • 我想你需要一个更完整的例子,如果第一行是b, a, c, _, d,会发生什么? d 会移动吗?
  • 我先按摩数据,这样可以有字母字符

标签: r stringi


【解决方案1】:

此解决方案生成一个布尔矩阵,其中每个向量为一行,每个可能的字符为一列。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2020-11-01
    • 1970-01-01
    • 2022-11-03
    • 2014-03-02
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多