如何通过比较两个字符串向量来过滤 Dataframe ?

tmb3ates  于 2023-03-05  发布在  其他
关注(0)|答案(4)|浏览(123)

我有一个包含两个字符串向量的 Dataframe ,例如

Xsz<-c("A", "B", "C")
Xal<-c("A|B", "A|C", "B|C")
XDF<-data.frame(Xsz,Xal)

我想过滤这些行,其中第一列(Xsz)中的字符串出现在第二列(本例中为第1行和第3行)
我试过这个:

XDF %>%
  filter(Xsz %in% Xal)

或者这个:

XDF %>%
  filter(grep(Xsz, Xal))

但是他们做的不一样,实际的 Dataframe 当然不是3行长,而是像60M ...:-)
谢谢您的建议!

wtlkbnrh

wtlkbnrh1#

基本R方法是使用apply进行索引,其中grepl跨行:

XDF[apply(XDF, 1, function(x) grepl(x[2], x[1])),]

#  Xsz Xal
#1   A A|B
#3   C B|C
iih3973s

iih3973s2#

看起来你想用Xal作为正则表达式的模式。你不能很容易地用grepl来做这个,因为它一次搜索一个模式,你有一个模式向量。你可以用stringr::str_detect()来代替。

library(tidyverse)       
Xsz<-c("A", "B", "C")
Xal<-c("A|B", "A|C", "B|C")
XDF<-data.frame(Xsz,Xal)  

XDF %>%
  filter(str_detect(Xsz, pattern = Xal))
#>   Xsz Xal
#> 1   A A|B
#> 2   C B|C

创建于2023年3月1日,使用reprex v2.0.2

w1e3prcc

w1e3prcc3#

另一个基本R选项使用sapplygrepl,如下所示:

XDF[diag(sapply(XDF$Xsz, \(x) grepl(x, XDF$Xal, fixed = TRUE))),]
#>   Xsz Xal
#> 1   A A|B
#> 3   C B|C

创建于2023年3月1日,使用reprex v2.0.2

c9qzyr3d

c9qzyr3d4#

如果需要完全匹配,您可以

XDF %>% group_by(Xsz) %>% filter(Xsz %in% strsplit(Xal, "|")[[1]])
    • 结果**
# A tibble: 2 × 2
# Groups:   Xsz [2]
  Xsz   Xal  
  <chr> <chr>
1 A     A|B  
2 C     B|C
    • 数据**
XDF <- data.frame(
  Xsz = c("A", "B", "C", "AA"),
  Xal = c("A|B", "A|C", "B|C", "A|B")
)

相关问题