【问题标题】:How can I use variable value as a parameter to grepl in R?如何在 R 中使用变量值作为 grepl 的参数?
【发布时间】:2020-08-14 04:48:34
【问题描述】:

下面是我的代码:

ABData <- data.frame(a = c(1,2,3,4,5),
                     id = c("Non valid cases with no consent for follow-up (a)", "Oxford", "Berlin",
                           "Hamburg", "Oslo"),
                     pass = c("CASE ARCHIVED - ACTELION LEGACY CASE :ST_NVC_CATEGORY_NAME Non valid cases with no consent for follow-up (a)","No London","asdBerlin","No Match","OsLondonlohama"))

b <- 'id'
c <- 'pass'

match<- ABData %>% rowwise() %>% filter(grepl(id,pass, fixed = TRUE))

mismatch<- ABData %>% rowwise() %>% filter(!grepl(id, pass))

我想在grepl 中使用变量 b 和 c 作为参数,但当时我没有得到正确的结果,当我使用数据框的实际列名时,我得到了正确的结果。

救命!!

【问题讨论】:

  • 如果变量不是函数,为什么要传递它?如果它是一个函数,那将很容易。你可以使用准引文。但现在,我不太确定。你可以试试ABData %&gt;% rowwise() %&gt;% filter(grepl(get(b),get(c), fixed = TRUE)),但这不是一个好主意。查看programming with dplyr 了解有关 NSE 的更多信息。
  • get() 工作正常。我在各种数据框中都有动态列名,所以我想我会采用这种方法..谢谢!

标签: r dataframe filter pattern-matching grepl


【解决方案1】:

您可以将sym!! 一起使用:

library(dplyr)
library(stringr)
library(rlang)

ABData %>% rowwise %>% filter(grepl(!!sym(b),!!sym(c), fixed = TRUE))

但是,您可以使用矢量化的str_detect 而不是grepl,因此您不需要rowwise

ABData %>% filter(str_detect(!!sym(c), fixed(!!sym(b))))

【讨论】:

    【解决方案2】:

    我们可以使用map.data

    library(dplyr)
    library(purrr)
    ABData %>%
           filter(map2_lgl(.data[[c]], .data[[b]], ~ grepl(.y, .x, fixed = TRUE )))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 2021-05-27
      • 2021-11-07
      • 2016-12-09
      • 2021-12-23
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多