【问题标题】:Parse comma-delimited string into vectors based on leading character根据前导字符将逗号分隔的字符串解析为向量
【发布时间】:2018-04-12 15:09:50
【问题描述】:

给定一个字符串:

vals <- "-AB, CV, CL, -TS"

我想高效地vals 解析成两个向量(我们称它们为negativepositive),一个包含以- 为前缀的值,而其他不包含。一个问题是我还想删除 - 指示符。

想要的结果:

> negative
[1] "AB" "TS"
> positive
[1] "CV" "CL"

简洁答案的奖励积分。

【问题讨论】:

  • 你尝试了什么,你在哪里卡住了?使用strsplit 或(str_split,如果您愿意)将字符串拆分为多个片段,使用grepl/str_detect 检查每个片段是否有- 并进行相应排序,然后使用sub 或删除-str_replace.

标签: r stringr


【解决方案1】:

你可以试试:

s <- trimws(strsplit(vals, ",")[[1]])
negative <- s[grepl("^-", s)]
positive <- s[!grepl("^-", s)]

您也可以通过这种方式使用纯正则表达式

library(stringr)
negative <- as.vector(str_match_all(vals, "-\\w+")[[1]])
positive <- as.vector(str_match_all(vals, "(?<!-)(?<=^|,| )\\w+")[[1]])

【讨论】:

  • 谢谢!所有好的答案,但你的答案最适合我正在尝试做的事情。
【解决方案2】:

您可以尝试将grepvalue = True 选项一起使用,而且由于您的数据有前导空格,要删除它们,您可以使用trimws。我在这里使用strsplit 和“,”作为分隔符。使用zeallot 库只需一步分配所有内容。

library(zeallot)
c(negative, positive) %<-% list(grep("^-",trimws(strsplit(vals,",")[[1]]), value=T), grep("^[^-]",trimws(strsplit(vals,",")[[1]]), value=T))

输出

#> negative
#[1] "-AB" "-TS"
#> positive
#[1] "CV" "CL"

【讨论】:

    【解决方案3】:

    试试:

    v <- trimws(strsplit(vals, ",")[[1]])
    
    positive <- v[!startsWith(v, '-')]
    negative <- substring(v[startsWith(v, '-')], 2)
    

    哪些输出:

    > negative
    [1] "AB" "TS"
    > positive
    [1] "CV" "CL"
    

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2020-06-12
      • 2019-12-04
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多