我有一个数据框(实际上是一个tibble)df
,有两列,a
和b
,我想过滤掉{{1}的行}是a
的子字符串。我试过了
b
但是我收到一条警告,似乎表明R实际上正在应用df %>%
dplyr::filter(grepl(a,b))
,第一个参数是整个列grepl
。
有没有办法将一个涉及两个不同列的正则表达式应用于tibble(或数据框)中的每一行?
答案 0 :(得分:4)
如果您只对行间比较感兴趣,可以使用rowwise()
:
df <- data.frame(A=letters[1:5],
B=paste0(letters[3:7],letters[c(2,2,4,3,5)]),
stringsAsFactors=F)
df %>%
rowwise() %>%
filter(grepl(A,B))
A B
1 b db
2 e ge
<强> -------------------------------------------- ------------------------------------- 强>
如果您想知道row-entry of A
中是否有all of B
:
df %>% rowwise() %>% filter(any(grepl(A,df$B)))
A B
1 b db
2 c ed
3 d fc
4 e ge
答案 1 :(得分:1)
或使用base R apply和@ Chi-Pak的可重现示例
df <- data.frame(A=letters[1:5],
B=paste0(letters[3:7],letters[c(2,2,4,3,5)]),
stringsAsFactors=F)
matched <- sapply(1:nrow(df), function(i) grepl(df$A[i], df$B[i]))
df[matched, ]
结果
A B
2 b db
5 e ge
答案 2 :(得分:1)
您可以使用stringr::str_detect
,它在字符串和模式上进行矢量化。 (正如您所指出的那样,grepl
仅在其字符串参数上进行矢量化。)
使用@Chi Pak的例子:
library(dplyr)
library(stringr)
df %>%
filter(str_detect(B, fixed(A)))
# A B
# 1 b db
# 2 e ge