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

时间:2019-06-05 15:13:42

标签: r string character subset

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

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)。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

我们可以使用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时)

答案 1 :(得分:3)

使用逻辑grepl可以按以下步骤完成。为了清楚起见,我将其保留在两个代码行中,但是将它做成单线很简单。

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