我有一个大型数据框(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
的列,就像我想要的那样。
答案 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