r 函数有条件地匹配部分字符串

r function to conditionally match parcial strings

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

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

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 而不是这种更简单的情况。

我们需要使用 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

您可以使用 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