R从数据框匹配正则表达式模式中删除列

时间:2019-06-20 16:57:54

标签: r regex

我正在运行一个脚本,该脚本会自动生成数据帧。在某些情况下,我得到具有特定模式的列,例如d123d3452。基本上是字符d,后跟几个数字。数字位数可能只是一个,有时甚至是4个字符的长度。我想删除所有与该特定模式匹配的列。示例数据帧如下:

df <- data.frame(d1234=c(1,2,3), b=c(3,4,5),c=c(4,5,3), d3245=c(3,2,4))

df看起来像这样:

  d1234 b c d3245
1     1 3 4     3
2     2 4 5     2
3     3 5 3     4

从这里我只想删除与模式匹配的第一列和最后一列。我尝试了以下方法:

df <- data.frame(d1234=c(1,2,3), b=c(3,4,5),c=c(4,5,3), d3245=c(3,2,4))
  colpat <- "[d[:digit:]]"
  if (colpat %in% names(df)) {
    d <- df[,!names(df) == colpat]  
  } else {
    d <- df
  }
  print(d)

但仍然保留列

2 个答案:

答案 0 :(得分:3)

我们可以使用grep对列名称中的模式进行正则表达式匹配。在这里,模式是检查字符串开头(^)后面是否有一个或多个数字(\\d+)到字符串结尾($)的字母'd'。字符串,使用invert = TRUE(默认为FALSE),并使用数字索引

设置列的子集
df[grep("^d\\d+$", names(df), invert = TRUE)]
#  b c
#1 3 4
#2 4 5
#3 5 3

答案 1 :(得分:2)

对于整洁的解决方案,在选择列时可以在matches帮助器中使用正则表达式。

df %>%
  select(-matches("d\\d+$"))

  b c
1 3 4
2 4 5
3 5 3