R 子集字符串值,包括竖线(|)

Posted

技术标签:

【中文标题】R 子集字符串值,包括竖线(|)【英文标题】:R subset string values including vertical bar(|) 【发布时间】:2019-10-21 03:11:43 【问题描述】:

我正在尝试根据列值对数据进行子集化。如果该特定列只有一个级别的信息,我正在尝试进行子集化。这是我的数据的样子。

data <- cbind(v1=c("a", "ab", "a|12|bc", "a|b", "ac","bc|2","b|bc|12"),
            v2=c(1,2,3,5,3,1,2))

> data
     v1        v2 
[1,] "a"       "1"
[2,] "ab"      "2"
[3,] "a|12|bc" "3"
[4,] "a|b"     "5"
[5,] "ac"      "3"
[6,] "bc|2"    "1"
[7,] "b|bc|12" "2"

我只想使用不包含“|”的字符值进行子集化,如下所示:

> data
     v1        v2 
[1,] "a"       "1"
[2,] "ab"      "2"
[3,] "ac"      "3"

基本上,我试图摆脱两级 (x|y) 或三级值 (x|y|z)。对此有什么想法吗?

谢谢!

【问题讨论】:

一个stringr 可能性:data[sapply(data,function(x) !str_detect(x,"\\|"))] 几个相关例子:***.com/q/22249702/5325862 【参考方案1】:

我们可以使用grep 来查找具有| 的行,使用invert 选项来获取没有| 的元素的行索引,使用它来子集matrix 的行

data[grep("|", data[,1], invert = TRUE, fixed = TRUE), ]
#   v1   v2 
#[1,] "a"  "1"
#[2,] "ab" "2"
#[3,] "ac" "3"

注意:使用fixed = TRUE,否则它将检查正则表达式模式,|OR 条件的元字符。其他选项是转义 (\\|) 或将其放在方括号内 ([|]) 以捕获文字字符(当 fixed = FALSE 时)

【讨论】:

谢谢!当我使用数据框而不是矩阵时,此方法是否有效? @amisos55 是的,它可以工作,除非是一个小标题。那么你可能需要data[[1]] 而不是data[,1]【参考方案2】:

使用逻辑grepl 这可以如下完成。为了清楚起见,我将其保留在两行代码中,但将其设为单行代码很简单。

i <- !grepl("\\|", data[, 1])
data[i, ]
#     v1   v2 
#[1,] "a"  "1"
#[2,] "ab" "2"
#[3,] "ac" "3"

【讨论】:

以上是关于R 子集字符串值,包括竖线(|)的主要内容,如果未能解决你的问题,请参考以下文章

R通过字符变量的值对data.table进行子集

选择字符串值子集中的第一个和最后一个值

java 竖线分割字符串的问题

ADBlock规则语法简介

如何在第一个逗号后拆分第一个竖线上的字符串?

java 竖线分割字符串怎么写