【问题标题】:r subset cell value from a column based on a match from another columnr 基于另一列的匹配从一列子集单元格值
【发布时间】:2018-03-09 10:55:41
【问题描述】:

我有一个包含两列 specialtykeywords 的数据框。如果在search terms 与列specialty 中的任何值之间找到匹配项,我使用以下代码从列keywords 中提取值:

speciality <- c("Emergency medicine","Allergology","Anesthesiology","Hematology","Cardiology")
keywords <- c("emergency room OR emergency medicine OR emergency department", 
          "Allergy OR rhinitis OR asthma OR atopic eczema", 
          "Pain OR local anaesthesia OR general anaesthesia OR induced sleep", 
          "Anemia OR bleeding disorders OR hemophilia OR blood cancers", 
          "Heart OR cardiac diseases OR Cardiomyopathy OR Congenital Heart Disease OR Cardiac Arrhythmia")
sample <- data.frame(speciality, keywords)
keyspecial <- "Allergology"
subkeywords <- subset(sample$keywords, sample$speciality==keyspecial)
View(subkeywords)

所以我在speciality 列中搜索Allergology。一旦我运行我得到的代码 Allergy OR rhinitis OR asthma OR atopic eczema

我面临的问题是,如果我搜索 allergology 而不是 Allergology,我不会得到结果。或者,如果我只想使用 emergency 而不是 Emergency medicine 进行搜索。

有什么建议吗?

【问题讨论】:

  • 您只需要一点正则表达式 - 对于您提到的情况,尝试类似 subkeywords &lt;- subset(sample$keywords, grepl("[Aa]llerg",sample$speciality)) 的内容 - 这将获取包含 Allergallerg 的任何内容。
  • 您可能对一个搜索词“过敏症”是正确的。但我的观点是,搜索词每次都会改变,因此,代码应该负责找到这些词,而不考虑案例和部分匹配。
  • grepl 将涵盖部分匹配问题。对于大写,您可以使用tolower 将所有内容转换为小写。所以subkeywords &lt;- subset(sample$keywords, grepl(tolower(keyspecial),tolower(sample$speciality)))。或者您可以在grepl 中使用ignore.case=TRUE

标签: r dataframe subset


【解决方案1】:

改变这一行:

subkeywords <- subset(sample$keywords, sample$speciality==keyspecial)

到这个:

subkeywords <- subset(sample$keywords, grepl(keyspecial, sample$speciality, ignore.case=TRUE))

它的工作原理是函数grepl,它有ignore.case 参数,可以设置为TRUE 以忽略大小写。然而,这个寻找不完整的匹配。所以当你搜索Allergology时,它也会找到The Allergology之类的东西。

为了只匹配完整的单词,你可以使用这个:

subkeywords <- subset(sample$keywords, tolower(sample$speciality)==tolower(keyspecial))

这样,您将首先将两个单词转换为小写形式,然后再进行比较。

【讨论】:

    【解决方案2】:

    您可以使用str_detect 并忽略大小写

    library(tidyverse)
    keyspecial <- "allergology"
    
    sample %>% 
      filter(str_detect(speciality, fixed(keyspecial, ignore_case = TRUE)))
    

    【讨论】:

      【解决方案3】:

      你可以尝试一些这样的字符串修剪:

      matchList <- sapply(speciality,function(x) strsplit(tolower(x),split=" ")[[1]])
      keyspecial <- "Allergology"
      subkeywords <- subset(sample$keywords,sapply(matchList,function(y){any(tolower(keyspecial) %in% y)}))
      View(subkeywords)
      keyspecial <- "allergology"
      subkeywords <- subset(sample$keywords,sapply(matchList,function(y){any(tolower(keyspecial) %in% y)}))
      View(subkeywords)
      

      【讨论】:

        猜你喜欢
        • 2014-12-08
        • 2021-06-22
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        相关资源
        最近更新 更多