R grep多列中的搜索模式

时间:2017-03-10 19:25:56

标签: r

我有一个如下数据框:

Col1    Col2    Col3
A       B       C
D       E       F
G       H       I

我正在尝试保持线条匹配' B'在' Col2'或者在' Col3'中,以获得:

Col1    Col2    Col3
A       B       C
D       E       F

我试过了:

data[(grep("B",data$Col2) || grep("F",data$Col3)), ]

但它返回整个数据框。

注意:一次调用2 grep时它可以正常工作。

3 个答案:

答案 0 :(得分:3)

names(DF)[unique(col(DF)[DF <= 2])] # [1] "V3" 列之后使用单个grepl

paste

答案 1 :(得分:2)

with(df1, df1[ Col2 == 'B' | Col3 == 'F',])
#   Col1 Col2 Col3
# 1    A    B    C
# 2    D    E    F

使用grepl

with(df1, df1[ grepl( 'B', Col2) | grepl( 'F', Col3), ])
#   Col1 Col2 Col3
# 1    A    B    C
# 2    D    E    F

数据:

df1 <- structure(list(Col1 = c("A", "D", "G"), Col2 = c("B", "E", "H"
), Col3 = c("C", "F", "I")), .Names = c("Col1", "Col2", "Col3"
), row.names = c(NA, -3L), class = "data.frame")

答案 2 :(得分:0)

data.table 包由于其紧凑且可读的语法而使这种类型的操作变得微不足道。以下是使用data.table执行上述操作的方法:

> df1 <- structure(list(Col1 = c("A", "D", "G"), Col2 = c("B", "E", "H"
+ ), Col3 = c("C", "F", "I")), .Names = c("Col1", "Col2", "Col3"
+ ), row.names = c(NA, -3L), class = "data.frame")

> library(data.table)
> DT <- data.table(df1)
> DT
   Col1 Col2 Col3
1:    A    B    C
2:    D    E    F
3:    G    H    I

> DT[Col2 == 'B' | Col3 == 'F']
   Col1 Col2 Col3
1:    A    B    C
2:    D    E    F
> 

data.table默认使用 with = TRUE 执行匹配操作。请注意,如果您在数据上设置键,那么匹配会快得多,但这适用于其他主题。