【问题标题】:r function to conditionally match parcial stringsr 函数有条件地匹配部分字符串
【发布时间】:2020-10-12 11:00:45
【问题描述】:

我有两个大数据集,我想对一些列进行子集化以便使用数据。 我的问题是子集的参考列不完全匹配。所以我希望能够匹配到相同的字符串部分。

这里有一个更简单的例子:

ref_df <- data.frame("reference" = c("swietenia macrophylla",                       
                                     "azadirachta indica",                        
                                     "cedrela odorata",                               
                                     "ochroma pyramidale",                            
                                     "tectona grandis",                               
                                     "tamarindus indica",                             
                                     "cariniana pyriformis",                          
                                     "paquita quinata",                               
                                     "albizia saman",                                 
                                     "enterolobium cyclocarpum",                      
                                     "tapirira guianensis",                           
                                     "dipteryx oleifera"),
                     "values" = c(rnorm(12)))

tofind_df <- c("swietenia macrophylla and try try",                       
           "azadirachta indica",                        
           "tamarindus indica (bla bla)",                             
           "tara",                          
           "bla bla (paquita quinata)",                               
           "prosopis pallida",                                 
           "dipteryx oleifera")

所以我尝试保留 ref_df 的所有值,这些值的名称在 tofond_df 中甚至部分匹配,但只有在它们相同时才匹配。

 finale <- ref_df[ref_df$reference %in% tofind_df$names,]

我也尝试使用 grepl,但找不到解决方案。

我理想的结局应该是这样的:

                  reference       values
1     swietenia macrophylla -0.459001383    
2        azadirachta indica -0.430014486
3         tamarindus indica -0.541887328
4           paquita quinata -0.003572792
5         dipteryx oleifera -0.855659901

请考虑一下两个大 df 而不是这种更容易的情况。

【问题讨论】:

  • 为什么“tamarindus indica”和“paquita quinata”匹配,而“swietenia macrophylla”不匹配?
  • 对不起,我的错误!

标签: r string matching partial


【解决方案1】:

我们需要使用sapplygrepl 获取每个元素的结果

ref_df[sapply(ref_df$reference, function(x) any(grepl(x, tofind_df))),]

               reference     values
1  swietenia macrophylla  1.4482830
2     azadirachta indica  0.9037943
6      tamarindus indica -0.2994678
8        paquita quinata  0.4895183
12     dipteryx oleifera -1.1652528

【讨论】:

    【解决方案2】:

    您可以使用 group_by 和 dplyr 中的过滤器和 stringr 中的 str_detect:

    library(dplyr)
    library(stringr)
    
    ref_df %>% 
      mutate(reference = as.character(reference))%>% #reference is factor. Making it a character
      group_by(reference) %>%
      filter(any(str_detect(tofind_df,reference)))%>% #Finding if there are any matches between each reference name and any of the strings in the tofind_df
      ungroup()
    
    # A tibble: 5 x 2
      reference             values
      <chr>                  <dbl>
    1 swietenia macrophylla -0.456
    2 azadirachta indica    -1.08 
    3 tamarindus indica     -0.428
    4 paquita quinata       -0.937
    5 dipteryx oleifera      0.816
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      相关资源
      最近更新 更多