2016-07-11 120 views
0

我想使用chacracter向量到數據幀列和單獨的字符向量之間的匹配一個數據幀:子集根據中的R

  1. 查找一個數據幀包含這個向量單或更大的匹配以逗號行數據幀
  2. 子集數據幀只保留行用火柴

實施例數據

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倍的值。

有沒有在var3列中使用strsplit的基礎r解決方案?

回答

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包含有可能將它縮短只是這一點(但它比上面更長的一個不那麼一般 - 例如ID1也將匹配ID11,如果我們使用這個但先前的解決方案沒有這個問題):

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

2)如果你願意放鬆strsplit要求那麼這仍然沒有使用任何套餐:

subset(df, sapply(strsplit(as.character(var3), ","), function(x) any(x %in% look))) 
0

) 我們可以在dplyr

使用 filterstr_detect
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 

注意:只提供一種方法。

0

可以使用grepl功能如上述完成OP使用相同的與基礎R

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