我正在运行一个脚本,该脚本会自动生成数据帧。在某些情况下,我得到具有特定模式的列,例如d123
或d3452
。基本上是字符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)
但仍然保留列
答案 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