如何在R中按名称模式删除列?
我有这个数据帧:如何在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”或任何其他字符串结尾)?
解决方案必须能够处理具有数值和分类值的数据帧。
你的代码的工作就像一个魅力,如果我把它应用到一个最小的例子,只是搜索字符串“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
为了排除你可以使用你可以使用任何字符串...
# 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
刚刚发现该解决方案以及;-) – 2013-03-27 18:21:14
对不一致。重点是我希望能够指定任何字符串作为一个colname的末尾,然后删除所有具有该字符串的列。因此,对于这个例子,数据“1”,“3”,“ity”,“ion”和“rix”都是有效的例子。 – histelheim 2013-03-27 18:23:59
@histelheim看代码编辑。 – 2013-03-27 18:26:05
只是作为一个附加的答案,因为我碰到这个偶然发现,寻找data.table
解决这个问题的时候。
library(data.table)
dt <- data.table(df)
drop.cols <- grep("1$", colnames(dt))
dt[, (drop.cols) := NULL]
+1。做得很好。 – 2013-03-27 18:26:22