我正在尝试基于列值对数据进行子集化。如果该特定的列只有一个级别的信息,我正在尝试子集。这是我的数据。
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)。有什么想法吗?
谢谢!
答案 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"