[英]How to drop columns by name pattern in 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”或任何其他字符串結尾)?
解決方案必須能夠處理具有數值和分類值的數據幀。
我使用dplyr
/ tidyverse
找到了一個簡單的答案。 如果您的colnames
包含“This”,則所有包含“This”的變量都將被刪除。
library(dplyr)
df_new <- df %>% select(-contains("This"))
如果我將它應用到一個最小的例子並且只搜索字符串“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
作為一個額外的答案,因為我在尋找這個問題的data.table
解決方案時偶然發現了這一點。
library(data.table)
dt <- data.table(df)
drop.cols <- grep("1$", colnames(dt))
dt[, (drop.cols) := NULL]
要排除任何字符串,您可以使用...
# 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
您可以使用正則表達式進一步擴展它以進行更廣泛的模式搜索。 我有一個數據框,它有一堆帶有"name"
、 "upper_name" and
"lower_name"` 的列,因為它們代表了一系列系列的置信區間,但我不需要它們。 因此,使用正則表達式,您可以執行以下操作:
pattern = "(upper_[a-z]*)|(lower_[a-z]*)"
policyData <- policyData[, -grep(pattern = pattern, colnames(policyData))]
“|” 允許我在正則表達式中包含一個 or 語句,這樣我就可以用一個模式執行一次,而不是查找每個模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.