it-swarm.com.de

Verwenden von grep, um einen Datenrahmen in R zu unterstützen

Ich habe Probleme, meine Daten zu subsettieren. Ich möchte, dass die Daten in Spalte x subsettiert werden, wobei die ersten 3 Zeichen mit G45 beginnen.

Mein Datenrahmen:

 x <- c("G448", "G459", "G479", "G406")  
 y <- c(1:4)
 My.Data <- data.frame (x,y)

Ich habe versucht:

 subset (My.Data, x=="G45*")

Aber ich bin nicht sicher, wie man Wildcards verwendet. Ich habe auch versucht, grep () zu finden, um die Anzeigen zu finden:

 grep  ("G45*", My.Data$x)

aber es gibt alle 4 Zeilen zurück, nicht nur die, die mit G45 anfangen, wahrscheinlich auch, weil ich nicht sicher bin, wie Platzhalter verwendet werden.

29
Stewart Wiseman

Es ist ziemlich einfach, mit [ zu extrahieren:

grep gibt Ihnen die Position an, an der es Ihrem Suchmuster entsprach (es sei denn, Sie verwenden value = TRUE). 

grep("^G45", My.Data$x)
# [1] 2

Da Sie innerhalb der Werte einer einzelnen Spalte suchen, entspricht dies tatsächlich dem Zeilenindex. Verwenden Sie das also mit [ (wo Sie My.Data[rows, cols] verwenden würden, um bestimmte Zeilen und Spalten zu erhalten).

My.Data[grep("^G45", My.Data$x), ]
#      x y
# 2 G459 2

Die Hilfeseite für subset zeigt, wie Sie grep und grepl mit subset verwenden können, wenn Sie diese Funktion lieber als [ verwenden. Hier ist ein Beispiel.

subset(My.Data, grepl("^G45", My.Data$x))
#      x y
# 2 G459 2

Ab R 3.3 gibt es jetzt auch die Funktion startsWith, die Sie erneut mit subset (oder mit einem der anderen Ansätze oben) verwenden können. Gemäß der Hilfeseite für die Funktion ist sie wesentlich schneller als die Verwendung von substring oder grepl.

subset(My.Data, startsWith(as.character(x), "G45"))
#      x y
# 2 G459 2
50

Sie können auch das Paket stringr verwenden

library(dplyr)
library(stringr)
My.Data %>% filter(str_detect(x, '^G45'))

Sie können '^' (beginnt mit) in diesem Fall nicht verwenden, um die gewünschten Ergebnisse zu erhalten

0
Ayan