0

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

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

它似乎工作正常,但对于像这样的行名

"(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] “溴三氟甲烷”

行名(数据)[1]
[1] “v0001_Bromotrifluoromethane”

grepl("v[0-9]*_Bromotrifluoromethane", rownames(data)[1])
[1] TRUE

grepl("v*[0-9]_Bromotrifluoromethane", rownames(data)[1])
[1] TRUE

4

2 回答 2

2

通常,您可以在名称和行名中使用带有类似字符的行名,您只需要在使用它们时引用它们。我认为这里的问题是subset函数,它允许一些不寻常的方法来指定子集,这使得一些事情更容易,但其他事情更难。它试图弄清楚行名的含义(而不仅仅是将它们视为文字字符串),而括号可能会混淆该过程。

尝试类似:

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

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

另请参阅fortune(69),==TRUE 是多余的,并且比加 0 或乘以 1 的用处稍小。

于 2013-06-12T20:20:15.013 回答
1

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

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

data[grepl(paste0("^v[0-9]*_", quotemeta(ws_names), collapse="|"), rownames(data)), ]
于 2013-06-12T21:25:36.843 回答