2016-07-11 11 views
0

ich einen chacracter Vektor verwenden mag:Subset ein Datenrahmen nach Übereinstimmungen zwischen Datenrahmen Spalt und separaten Zeichen Vektor in R

  1. Finden Zeilen in einem Datenrahmen, die einzelnen oder mehr Übereinstimmungen zu diesem Vektor in einem Komma enthalten getrennte Liste innerhalb einer Spalte des Datenrahmen
  2. Subset des Datenrahmen nur die Zeilen mit Streichhölzern

Beispiel Daten

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 
Halten

Wo die Ausgabe würde wie folgt aussehen:

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

Das Spiel zwischen der var3 Spalte größer als 1 Wert aus dem look Vektor sein könnte.

Gibt es eine Basislösung, die keine strsplit auf der var3 Spalte enthält?

Antwort

2

1) Erstellen Sie den entsprechenden regulären Ausdruck und führen Sie einen Grep aus. Wie verlangt dies keine Pakete nicht verwendet und nicht strsplit nicht verwendet:

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

geben:

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

1a) Je nach genau das, was var3 und look enthalten es möglich sein, kann es zu verkürzen nur das (aber es ist weniger allgemein als die längere oben - zum Beispiel ID1 würde auch ID11 entsprechen, wenn wir dies verwendet, aber die vorherige Lösung hat dieses Problem nicht):

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

2) Wenn Sie bereit sind, die strsplit Anforderung dann keine Pakete zu verwenden ist dies nach wie vor entspannen:

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

) Wir filter mit str_detect in dplyr

verwenden können
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 

HINWEIS: Es wird nur eine Methode bereitgestellt.

0

Sie können das gleiche mit Sockel R mit Grepl Funktion wie oben OP verwenden getan

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 
Verwandte Themen