2013-03-27 15 views
14

Ich habe diesen Datenrahmen:Wie man Spalten durch Namensmuster in R fallen lässt?

state county city region mmatrix X1 X2 X3 A1  A2  A3  B1  B2  B3  C1  C2  C3 

    1  1  1  1  111010 1 0 0  2  20 200  Push  8  12  NA  NA  NA 
    1  2  1  1  111010 1 0 0  4  NA 400  Shove  9  NA 

Jetzt mag ich Spalten, deren Namen mit einer bestimmten Zeichenfolge enden auszuschließen, sagen Sie „1“ (das heißt A1 und B1). Ich schrieb diesen Code:

Dies scheint jedoch jede Spalte zu löschen. Wie kann ich den Code so ändern, dass er nur die Spalten löscht, die mit dem Muster übereinstimmen (d. H. Mit "3" oder einer anderen Zeichenfolge enden)?

Die Lösung muss in der Lage sein, einen Datenrahmen mit numerischen und kategorialen Werten zu verarbeiten.

Antwort

27

Ihr Code funktioniert wie ein Zauber, wenn ich es auf ein minimales Beispiel anwenden und nur die Suche nach der Zeichenfolge „A“:

df <- data.frame(ID = 1:10, 
       A1 = rnorm(10), 
       A2 = rnorm(10), 
       B1 = letters[1:10], 
       B2 = letters[11:20]) 
df[, -grep("A", colnames(df))] 

So Ihr Problem ist ein regulärer Ausdruck Problem, nicht wie Spalten fallen . Wenn ich Ihren Code ausführen, erhalte ich einen Fehler:

df[, -grep("\\3$", colnames(df))] 
Error in grep("\\3$", colnames(df)) : 
    invalid regular expression '\3$', reason 'Invalid back reference' 

Update: Warum verwenden Sie nicht einfach diesen folgenden Ausdruck?

df[, -grep("1$", colnames(df))] 
    ID   A2 B2 
1 1 2.0957940 k 
2 2 -1.7177042 l 
3 3 -0.0448357 m 
4 4 1.2899925 n 
5 5 0.7569659 o 
6 6 -0.5048024 p 
7 7 0.6929080 q 
8 8 -0.5116399 r 
9 9 -1.2621066 s 
10 10 0.7664955 t 
+0

+1. Schön gemacht. –

4

Für eine beliebige Zeichenfolge ohne Sie Sie verwenden können, verwenden können ...

# Search string to exclude 
strng <- "1" 
df <- data.frame(matrix(runif(25,max=10),nrow=5)) 
colnames(df) <- paste("EX" , 1:5) 
df_red <- df[, -(grep(paste0(strng , "$") , colnames(df),perl = TRUE)) ] 

    df 
#   EX 1  EX 2  EX 3  EX 4  EX 5 
# 1 7.332913 4.972780 1.175947853 6.428073 8.625763 
# 2 2.730271 3.734072 6.031157537 1.305951 8.012606 
# 3 9.450122 3.259247 2.856123205 5.067294 7.027795 
# 4 9.682430 5.295177 0.002015966 9.322912 7.424568 
# 5 1.225359 1.577659 4.013616377 5.092042 5.130887 

    df_red 
#   EX 2  EX 3  EX 4  EX 5 
# 1 4.972780 1.175947853 6.428073 8.625763 
# 2 3.734072 6.031157537 1.305951 8.012606 
# 3 3.259247 2.856123205 5.067294 7.027795 
# 4 5.295177 0.002015966 9.322912 7.424568 
# 5 1.577659 4.013616377 5.092042 5.130887 
+0

Genau diese Lösung gefunden ;-) –

+1

Sorry für die Inkonsistenz. Der Punkt ist, dass ich in der Lage sein soll, eine beliebige Zeichenfolge anzugeben, die das Ende eines Spaltennamens ist, und dann alle Spalten zu löschen, die diese Zeichenfolge am Ende haben. Für dieses Beispiel wären die Daten "1", "3", "ity", "ion" und "rix" alle gültige Beispiele. – histelheim

+1

@histelheim siehe Code bearbeiten. –

4

nur als zusätzliche Antwort, da ich auf diese stolperte, wenn sie für die data.table Lösung für dieses Problem suchen.

library(data.table) 
dt <- data.table(df) 
drop.cols <- grep("1$", colnames(dt)) 
dt[, (drop.cols) := NULL] 
Verwandte Themen