在数据帧中通过正则表达式过滤列

时间:2015-05-21 20:30:54

标签: regex r

我有一个大型数据框(3000多列),我正在尝试获取遵循此模式的所有列名称的列表:

"stat.mineBlock.minecraft.123456stone"
"stat.mineBlock.minecraft.DFHFFBSBstone2"
"stat.mineBlock.minecraft.AAAstoneAAAA"

我的代码:

stoneCombined<-grep("^[stat.mineBlock.minecraft.][a-zA-Z0-9]*?[stone][a-zA-Z0-9]*?", colnames(ingame), ignore.case =T)

其中游戏是我正在搜索的数据帧。我的代码返回一个数字列表,而不是我期待的数据帧列(如上所述)。有人告诉我为什么?

添加value=TRUE后(感谢用户227710):

我现在获得了列名,但是我的数据集中的每一列都不是那些包含stat.mineBlock.minecraft.stone的列,就像我想要的那样。

3 个答案:

答案 0 :(得分:2)

要返回列名,您需要将value=TRUE设置为grep的附加参数。 grep中的默认选项是设置value=FALSE,因此它会为您提供匹配的同名的索引。 。

help("grep") 
value   
if FALSE, a vector containing the (integer) indices of the matches determined by grep is returned, and if TRUE, a vector containing the matching elements themselves is returned.

grep("your regex pattern", colnames(ingame),value=TRUE, ignore.case =T)

答案 1 :(得分:2)

以下是dplyr中的解决方案:

library(dplyr)
your_df %>%
  select(starts_with("stat.mineBlock.minecraft"))

将列名与正则表达式匹配的更一般方法是使用matches()内的select()。有关详细信息,请参阅?select

答案 2 :(得分:0)

我的回答基于this SO post。根据正则表达式,你非常接近。 只需[]创建一个与定义的集合中的单个字符匹配的字符类,这是它无法正常工作的主要原因。此外,perl=T在R中使用regex总是更安全。

所以,这是我的示例代码:

df <- data.frame(
  "stat.mineBlock.minecraft.123456stone" = 1,
  "stat.mineBlock.minecraft.DFHFFBSBwater2" = 2,
  "stat.mineBlock.minecraft.DFHFFBSBwater3" = 3,
  "stat.mineBlock.minecraft.DFHFFBSBstone4" = 4
)
grep("^stat\\.mineBlock\\.minecraft\\.[a-zA-Z0-9]*?stone[a-zA-Z0-9]*?", colnames(df), value=TRUE, ignore.case=T, perl=T)

请参阅IDEONE demo

相关问题