Ich habe einen Datenrahmen und möchte Spaltennamen erfassen, die zu bestimmten Mustern passen. Ich habe vier Sätze von Mustern:
# set 1 (underscore, no A)
cat1_1
cat12_12
# set 2 (underscore, A)
cat4_4A
cat18_18A
# set 3 (no underscore, no p)
dog2
dog12
# set 4 (no underscore, p)
dog2p
dog12p
Mein tatsächlicher Datenrahmen enthält eine unterschiedliche Anzahl von Spalten pro Satz, aber ich zeige in diesem Beispiel der Einfachheit halber nur zwei Spalten pro Satz.
ex <- data.frame(cat1_1=c("1a", "1a"),
cat12_12=c("1b", "1b"),
cat4_4A=c("2a", "2a"),
cat18_18A=c("2b", "2b"),
dog2=c("3a", "3a"),
dog12=c("3b", "3b"),
dog2p=c("4a", "4a"),
dog12p=c("4b", "4c"))
ex
# cat1_1 cat12_12 cat4_4A cat18_18A dog2 dog12 dog2p dog12p
#1 1a 1b 2a 2b 3a 3b 4a 4b
#2 1a 1b 2a 2b 3a 3b 4a 4c
Ich möchte names(ex)
grep, damit ich alle Variablen von Satz 1, dann separat alle Variablen von Satz 2 usw. greife. So sollte beispielsweise grep(PATTERN, names(ex))
für Satz 1 Folgendes zurückgeben:
[1] "cat1_1" "cat12_12"
Ich würde mich über Hilfe beim Grep-Muster für jeden Satz freuen. Eine Einschränkung ist, dass ich keine Spaltennamen ändern möchte.
3 Antworten
Basierend auf dem vom OP gezeigten Beispiel, wenn wir Muster in den Spaltennamen finden müssen, beginnen diese (^
) mit 'cat', gefolgt von einer oder mehreren Zahlen (\\d+
), gefolgt von einem Unterstrich ( \\_
) gefolgt von einer oder mehreren Zahlen ('\ d +') bis zum Ende der Zeichenfolge ($
) erhalten wir 'cat1_1', 'cat12_12'.
grep('^cat\\d+\\_\\d+$', names(ex), value=TRUE)
Eine ähnliche Logik kann für die anderen Fälle verwendet werden.
grep('^cat\\d+\\_\\d+[A-Z]+$', names(ex), value= TRUE)
grep('^dog\\d+$', names(ex), value=TRUE)
grep('^dog\\d+[a-z]+$', names(ex), value=TRUE)
Oder eine andere Option wäre, split
die Spaltennamen durch Erstellen einer Gruppierungsvariablen basierend auf names(ex)
zu erstellen
split(names(ex), gsub('\\d+(?=\\_)|(?<=\\_)\\d+|(?<=[a-z])\\d+',
'1', names(ex), perl=TRUE))
#$cat1_1
#[1] "cat1_1" "cat12_12"
#$cat1_1A
#[1] "cat4_4A" "cat18_18A"
#$dog1
#[1] "dog2" "dog12"
#$dog1p
#[1] "dog2p" "dog12p"
Verwenden Sie die Option beginnt mit ^
und endet mit $
Regex ::
names(ex)[grep("^cat.*[0-9]$", names(ex))]
names(ex)[grep("^cat.*A$", names(ex))]
names(ex)[grep("^dog.*[0-9]$", names(ex))]
names(ex)[grep("^dog.*p$", names(ex))]
Als Ergänzung zu den bisher guten Antworten hat R einige "spezielle" Zeichenfolgen, die den Übergang zur Verwendung regulärer Ausdrücke erleichtern könnten. Zum Beispiel stimmt [:digit:]
mit einem beliebigen numerischen Wert überein und [:alpha:]
mit einem beliebigen alphabetischen Zeichen.
Wenn wir dies auf die vier Spaltennamentypen anwenden, mit denen Sie arbeiten, erhalten wir Folgendes:
grep("^cat[[:digit:]]+_[[:digit:]]+$", names(ex), value=TRUE)
# "cat1_1" "cat12_12"
grep("^cat[[:digit:]]+_[[:digit:]]+A$", names(ex), value=TRUE)
# "cat4_4A" "cat18_18A"
grep("^dog[[:digit:]]+$", names(ex), value=TRUE)
# "dog2" "dog12"
grep("^dog[[:digit:]]+p$", names(ex), value=TRUE)
# "dog2p" "dog12p"
Beachten Sie, dass wir [:digit:]
in einen anderen Satz eckiger Klammern einschließen müssen, um den Wertebereich, den es darstellt, richtig abzugrenzen, aber zumindest denke ich, dass es für einen Neuling etwas lesbarer ist als doppelte Escape-Zeichen wie {{X1 }} (obwohl Sie irgendwann müde werden, die zusätzlichen Zeichen einzugeben: D).
Eine vollständige Liste dieser "speziellen" Zeichenfolgen und andere nützliche Informationen zu regulären Ausdrücken in R finden Sie unter dieser Link aus der R-Basisdokumentation.
Neue Fragen
r
R ist eine kostenlose Open-Source-Programmiersprache und Softwareumgebung für statistisches Rechnen, Bioinformatik, Visualisierung und allgemeines Rechnen. Bitte geben Sie minimale und reproduzierbare Beispiele zusammen mit der gewünschten Ausgabe an. Verwenden Sie dput () für Daten und geben Sie alle Nicht-Basispakete mit library () -Aufrufen an. Betten Sie keine Bilder für Daten oder Code ein, sondern verwenden Sie stattdessen eingerückte Codeblöcke. Verwenden Sie für statistische Fragen https://stats.stackexchange.com.