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 子集字符串值,包括竖线(|)的主要内容,如果未能解决你的问题,请参考以下文章