2013-03-27 8 views
14

mam ten dataframe:Jak upuścić kolumny według wzorca nazwy w R?

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 

teraz chcę, aby wykluczyć kolumny, których nazwy kończą się pewien ciąg, powiedzieć "1" (czyli A1 i B1). Napisałem ten kod:

df_redacted <- df[, -grep("\\1$", colnames(df))] 

Jednak wydaje się, że wszystkie kolumny są usuwane. Jak mogę zmodyfikować kod tak, aby usuwał tylko kolumny pasujące do wzorca (tj. Kończy się na "3" lub jakikolwiek inny ciąg znaków)?

Rozwiązanie musi obsługiwać ramkę danych z wartościami liczbowymi i kategorycznymi.

Odpowiedz

27

Twój kod działa jak czar, jeśli stosuje się go w minimalnym przykład i po prostu poszukać napisu „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))] 

Więc problem jest bardziej regularny problemu ekspresji, a nie jak do spadku kolumny . Jeśli uruchomić kod, pojawia się błąd:

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

Update: Dlaczego nie można po prostu użyć tej następujące wyrażenie?

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. Ładnie wykonane. –

4

Dla wyłączeniem ciąg można użyć można użyć ...

# 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

Po prostu znalazłem to rozwiązanie ;-) –

+1

Przepraszamy za niespójność. Chodzi o to, że chcę móc określić dowolny ciąg, który jest końcem nazwy kolumny, a następnie usunąć wszystkie kolumny, które mają ten ciąg na końcu. Tak więc dla tego przykładu wszystkie dane "1", "3", "ity", "ion" i "rix" byłyby poprawnymi przykładami. – histelheim

+1

@histelheim patrz edycja kodu. –

4

tylko jako dodatkową odpowiedź, ponieważ natknąłem się to, patrząc na data.table rozwiązanie tego problemu.

library(data.table) 
dt <- data.table(df) 
drop.cols <- grep("1$", colnames(dt)) 
dt[, (drop.cols) := NULL] 
Powiązane problemy