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.

2
Eric Green 30 Dez. 2015 im 19:45

3 Antworten

Beste Antwort

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"
2
akrun 30 Dez. 2015 im 17:08

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))]
1
Parfait 30 Dez. 2015 im 17:07

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.

0
Derek Damron 30 Dez. 2015 im 17:37