根据数据帧列与R中单独的字符向量之间的匹配来设置数据帧

时间:2016-07-11 10:54:32

标签: r vector dataframe subset

我想使用chacracter矢量:

  1. 在数据框的列中以逗号分隔的列表中查找数据框中包含与此向量的单个或更多匹配项的行
  2. 子集数据框仅保留匹配
  3. 的行

    示例数据

    look<-c("ID1", "ID2", "ID5", "ID9")
    df<-data.frame(var1=1:10, var2=3:12, var3=rep(c("","ID1,ID3","ID1,ID9","","")))
    df
       var1 var2    var3
    1     1    3        
    2     2    4 ID1,ID3
    3     3    5 ID1,ID9
    4     4    6        
    5     5    7        
    6     6    8        
    7     7    9 ID1,ID3
    8     8   10 ID1,ID9
    9     9   11        
    10   10   12 
    

    输出结果如下:

        var1 var2    var3
    1    2    4 ID1,ID3
    2    3    5 ID1,ID9
    3    7    9 ID1,ID3
    4    8   10 ID1,ID9
    

    var3列之间的匹配可能大于look向量中的1个值。

    是否有基础解决方案不涉及在strsplit列上使用var3

3 个答案:

答案 0 :(得分:2)

1)创建适当的正则表达式并执行grep。根据要求,这不使用任何包,也不使用strsplit

subset(df, grepl(paste0("\\b", paste(look, collapse = "|"), "\\b"), var3))

,并提供:

  var1 var2    var3
2    2    4 ID1,ID3
3    3    5 ID1,ID9
7    7    9 ID1,ID3
8    8   10 ID1,ID9

1a)具体取决于var3look包含的内容,可能会将其缩短为此(但它不如上面较长的那样 - - 例如,如果我们使用此ID1ID11也匹配subset(df, grepl(paste(look, collapse = "|"), var3)) ,但先前的解决方案没有此问题):

strsplit

2)如果您愿意放宽subset(df, sapply(strsplit(as.character(var3), ","), function(x) any(x %in% look))) 要求,那么这仍然不会使用任何套餐:

add_action( 'woocommerce_after_shop_loop_item', 'custom_display_post_meta', 9 );

function custom_display_post_meta() {
   global $product;
   $attr = array('pa_cooling-capacity-watts', 'pa_heating-capacity-watts');
   foreach ( $attr as $attribute ) {
   $values = wc_get_product_terms( $product->id, $attribute, array( 'fields' => 'names' ) );
    echo apply_filters( 'woocommerce_attribute', wpautop( wptexturize( implode( ', ', $values ) ) ), $attribute, $values );
}
}

答案 1 :(得分:0)

<强> 1 ) 我们可以在filter

中将str_detectdplyr一起使用
 library(dplyr)
 library(stringr)
 df %>% 
   filter(str_detect(var3, paste(look, collapse="|")))
 #    var1 var2    var3
 # 1    2    4 ID1,ID3
 # 2    3    5 ID1,ID9
 # 3    7    9 ID1,ID3
 # 4    8   10 ID1,ID9

注意:只提供一种方法。

答案 2 :(得分:0)

您可以使用grepl函数与基本R一样使用上面的OP完成

 df <- df[grepl("\\,",df$var3),]
  var1 var2    var3
2    2    4 ID1,ID3
3    3    5 ID1,ID9
7    7    9 ID1,ID3
8    8   10 ID1,ID9