我正在尝试使用工作和测试集的名称来分组数据
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] TRUEgrepl(&#34; v * [0-9] _Bromotrifluoromethane&#34;,rownames(data)[1])
[1] TRUE
答案 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)), ]