Regex 带括号的行名:R中是否允许它们?

Regex 带括号的行名:R中是否允许它们?,regex,r,names,Regex,R,Names,我正在尝试使用工作和测试集的名称对数据进行子集划分 ws_data <- subset(data, grepl(paste0("v*[0-9]_",ws_names, collapse="|" ), rownames(data))==TRUE) 只是跳过了。 括号是否允许作为R中的法定名称?如何解决不更改行名称的问题? 提前谢谢 数据示例 64 | v0064 |(氯)(三氟)甲烷|-51.5 | 510.9 | 104.5 | 11.2 | 65 | v0067

我正在尝试使用工作和测试集的名称对数据进行子集划分

ws_data <- subset(data, grepl(paste0("v*[0-9]_",ws_names, collapse="|" ),
           rownames(data))==TRUE)
只是跳过了。 括号是否允许作为R中的法定名称?如何解决不更改行名称的问题? 提前谢谢

数据示例

64 | v0064 |(氯)(三氟)甲烷|-51.5 | 510.9 | 104.5 | 11.2 |
65 | v0067 |(二氯)二氟甲烷|-81.0 | 233.0 | 121.0 | 16.1 |

正则表达式

行名称(ts)[1]
[1] “溴三氟甲烷”

行名称(数据)[1]
[1] “v0001_溴三氟甲烷”

grepl(“v[0-9]*_溴三氟甲烷”,行名(数据)[1])
[1] 真的

grepl(“v*[0-9]_溴三氟甲烷”,行名(数据)[1])
[1] 真的


通常,您可以在名称和行名中使用类似的字符,使用时只需引用它们。我认为这里的问题是
subset
函数,它允许一些不寻常的方法来指定子集,这使得一些事情更容易,但另一些事情更难。它试图弄清楚您所说的行名是什么意思(而不仅仅是把它们当作文字字符串),括号可能会混淆这个过程

尝试以下方法:

data[ grepl( paste0("v*[0-9]_",ws_names, collapse="|" ), rownames(data)), ]
如果可以构造名称列表,您还可以使用%中的
%来简化此操作


另请参见《财富》(69)
,==TRUE是多余的,比添加0或乘以1稍微有用。

通常,您可以在名称和行名中使用类似的字符,使用时只需引用它们。我认为这里的问题是
subset
函数,它允许一些不寻常的方法来指定子集,这使得一些事情更容易,但另一些事情更难。它试图弄清楚您所说的行名是什么意思(而不仅仅是把它们当作文字字符串),括号可能会混淆这个过程

尝试以下方法:

data[ grepl( paste0("v*[0-9]_",ws_names, collapse="|" ), rownames(data)), ]
如果可以构造名称列表,您还可以使用%中的
%来简化此操作


另请参见《财富》(69)
,==TRUE是多余的,比加0或乘1稍微有用一些。

我猜您面临的问题是,括号在正则表达式中有意义。有一种治疗方法,你可以用它来做这样的事情:

quotemeta <- function(x) gsub("([^A-Za-z_0-9])", "\\\\\\1", x)

data[grepl(paste0("^v[0-9]*_", quotemeta(ws_names), collapse="|"), rownames(data)), ]

quotemeta我猜您面临的问题是,括号在正则表达式中有意义。有一种治疗方法,你可以用它来做这样的事情:

quotemeta <- function(x) gsub("([^A-Za-z_0-9])", "\\\\\\1", x)

data[grepl(paste0("^v[0-9]*_", quotemeta(ws_names), collapse="|"), rownames(data)), ]


quotemeta您可以发布显示问题的数据子集吗?数据框相当大,但我添加了一个简短的示例wait,那么开始的列“v0064(氯)(三氟)甲烷”是实际的数据列还是数据集的行名?看起来您的行名是数字,在本例中是64和65。不,它们是行名。我认为,这只是RStudio在视图窗口中描述数据的方式。如果有必要,我将修复该示例。您的模式要求匹配0个或多个“v”,后跟一个数字,后跟下划线“”,后跟ws_name元素。该模式与示例数据中的任何内容都不匹配。我想你可能想要“[0-9]”之后的“*”,即“v[0-9]*”,而不是你现在拥有的。你能发布一个显示问题的数据子集吗?数据框相当大,但我添加了一个简短的示例Wait,那么开始的列
“v0064(氯)(三氟)甲烷”
是实际的数据列,还是数据集的行名?看起来您的行名是数字,在本例中是64和65。不,它们是行名。我认为,这只是RStudio在视图窗口中描述数据的方式。如果有必要,我将修复该示例。您的模式要求匹配0个或多个“v”,后跟一个数字,后跟下划线“”,后跟ws_name元素。该模式与示例数据中的任何内容都不匹配。我想您可能需要“[0-9]”之后的“*”,即“v[0-9]*”而不是您现在拥有的。谢谢您的帮助,但它似乎给出了与以前代码相同的结果。还有,我想问一下什么是财富(69)?@Boddha,财富套餐包含了R社区收集的智慧和智慧。如果安装并加载软件包,然后运行
fortune(69)
它将打印特定的fortune,运行
fortune()
将选择一个随机的fortune。时不时地阅读一些随机的财富可以是一种娱乐和/或教育。哦,太棒了!我一定会尝试的。谢谢你的帮助,但它似乎给出了与前面代码相同的结果。还有,我想问一下什么是财富(69)?@Boddha,财富套餐包含了R社区收集的智慧和智慧。如果安装并加载软件包,然后运行
fortune(69)
它将打印特定的fortune,运行
fortune()
将选择一个随机的fortune。时不时地阅读一些随机的财富可以是一种娱乐和/或教育。哦,太棒了!我一定要试试。太好了,谢谢!我在想类似的事情,但它更整洁。太好了,谢谢!我在想类似的事情,但要整洁得多。