2013-03-27 51 views
14

我有這個數據幀:如何在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 

現在我要排除其名稱與某些字符串結束了,說「1」(即A1和B1)列。我寫了這段代碼:

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

但是,這似乎刪除了每一列。我該如何修改代碼,以便只刪除與模式匹配的列(即以「3」或任何其他字符串結尾)?

解決方案必須能夠處理具有數值和分類值的數據幀。

回答

27

你的代碼的工作就像一個魅力,如果我把它應用到一個最小的例子,只是搜索字符串「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))] 

所以你的問題更是一個正則表達式的問題,而不是如何刪除列。如果我運行你的代碼,我得到一個錯誤:

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

更新:你爲什麼不用這個下面的表達式?

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。做得很好。 – 2013-03-27 18:26:22

4

爲了排除你可以使用你可以使用任何字符串...

# 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

剛剛發現該解決方案以及;-) – 2013-03-27 18:21:14

+1

對不一致。重點是我希望能夠指定任何字符串作爲一個colname的末尾,然後刪除所有具有該字符串的列。因此,對於這個例子,數據「1」,「3」,「ity」,「ion」和「rix」都是有效的例子。 – histelheim 2013-03-27 18:23:59

+1

@histelheim看代碼編輯。 – 2013-03-27 18:26:05

4

只是作爲一個附加的答案,因爲我碰到這個偶然發現,尋找data.table解決這個問題的時候。

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