带括号的Rownames:R中是否允许使用?

时间:2013-06-12 19:51:59

标签: regex r names

我正在尝试使用工作和测试集的名称来分组数据

ws_data <- subset(data, grepl(paste0("v*[0-9]_",ws_names, collapse="|" ),
           rownames(data))==TRUE)

似乎工作正常,但对于像

这样的rownames
"(Difluoromethoxy)trifluoromethane"

刚刚被跳过。 是否允许括号作为R中的合法名称?如何在不更改行名的情况下解决此问题? 提前谢谢!

数据示例

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

正则表达式

  

rownames(TS)[1]
     [1]&#34;溴三氟甲烷&#34;

     

rownames(数据)[1]
     [1]&#34; v0001_Bromotrifluoromethane&#34;

     

grepl(&#34; v [0-9] * _ Bromotrifluoromethane&#34;,rownames(data)[1])
     [1] TRUE

     

grepl(&#34; v * [0-9] _Bromotrifluoromethane&#34;,rownames(data)[1])
     [1] TRUE

2 个答案:

答案 0 :(得分:2)

一般情况下,你可以在名字和rownames中使用带有字符的rownames,你只需要在使用它们时引用它们。我认为这里的问题是subset函数,它允许一些不寻常的方法来指定使某些事情更容易的子集,但其他更难。它试图找出rownames的意思(而不仅仅是将它们作为文字字符串),括号可能会混淆该过程。

尝试类似:

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

如果您可以构建名称列表,也可以使用%in%简化此操作。

另见fortune(69),== TRUE是多余的,比添加0或乘以1稍微有用。

答案 1 :(得分:1)

我猜你所面临的问题是括号在正则表达式中有意义。 This post可以解决这个问题,你可以用它来做这样的事情:

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

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