我想使用chacracter矢量:
示例数据
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
?
答案 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)具体取决于var3
和look
包含的内容,可能会将其缩短为此(但它不如上面较长的那样 - - 例如,如果我们使用此ID1
,ID11
也匹配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_detect
与dplyr
一起使用
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