【问题标题】:Partial String Match in R Data TableR 数据表中的部分字符串匹配
【发布时间】:2020-09-19 14:46:51
【问题描述】:

我正在尝试将 R Shiny 下拉菜单(选择多个值)中的字符串(或字符串列表)与数据表特定列中的数据进行匹配。

详情:

  • var_to_plot() 是在 R Shiny UI 的下拉菜单中选择的字符串列表(如果只选择了一个值,则为单个字符串)。它返回例如Var1
  • df$Relevant_Column 中我希望它匹配的行中的数据如下所示:
  • Test1_Var1, Test2_Var1, Test2_Var2
  • 我想同时过滤Var1Var2
  • 使用 Grepl 时仅选择 1 个有效,在下面的代码中,但不是两个,因为我收到警告:“在 grep(var_to_plot(), df$Relevant_Column) 中出现警告: 参数 'pattern' 的长度 > 1,并且只会使用第一个元素d"
  • 即它只过滤列表中的第一个字符串,而不是全部。
  • 所以我尝试使用sqldf,但没有成功,如下所示。

我尝试了以下方法:

  1. 使用 Grepl(返回警告):

    df[grepl(var_to_plot(), df$Relevant_Column), ]

  2. 使用 SQLDF(返回空 DF,因为某些原因它与 var_to_plot() 不匹配)

    df = sqldf("SELECT * FROM df WHERE Relevant_Column LIKE '%var_to_plot()%'")

【问题讨论】:

  • 如果没有可重复的示例,很难给出具体建议,但您可以尝试类似df[stringr::str_detect(df$Relevant_Column, stringr::str_c(var_to_plot(), collapse = "|")), ] 的方法。此代码假设您将 'var_to_plot()' 强制转换为字符向量。
  • 效果很好。谢谢!随意提供它作为答案,我会接受。
  • 我很高兴它成功了!我发布了一个答案,还添加了基本 R 和 data.table 选项。

标签: r dataframe datatable sqldf grepl


【解决方案1】:

您可能希望将搜索词连接成一个有效的正则表达式,方法是用竖线分隔它们。

df <- data.frame(
  rowid = 1:4,
  Relevant_Column = c("Test1_Var1", "Test2_Var1", "Test2_Var2", "Text3_Var3")
)

var_to_plot <- c("Var1", "Var2")

## Base R.
df[grepl(paste(var_to_plot, collapse = "|"), df$Relevant_Column), ]

## Tidyverse.
library("stringr")
library("dplyr")
filter(df, str_detect(Relevant_Column, str_c(var_to_plot, collapse = "|")))

## data.table
library("data.table")
DT <- as.data.table(df)
DT[grepl(paste(var_to_plot, collapse = "|"), Relevant_Column)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2014-08-07
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多