仅使用字符向量的精确匹配的子集R数据帧



我想按列名为数据帧(data(子集。我有一个带有列名ID的字符向量,我想排除(IDnames(

我通常做的事情是这样的:

Data[ ,!colnames(Data) %in% IDnames]

然而,我面临的问题是;X-360";另一个";X-360.1〃;列中。我只想排除";X-360";(也在字符矢量中(,但不是"0";X-360.1〃;(它不在字符向量中,但无论如何都是提取的(。-所以我只想要精确的匹配,这似乎不适用于%。

这似乎是一个简单的问题,但我就是找不到解决办法。。。

更新

事实上,问题是我的data.frame中有重复的名称!我花了一段时间才弄清楚这一点,因为当我用查看子集列时

Data[ ,colnames(Data) %in% IDnames]

它显示了";X-360";以及";X-360.1〃;如上所述。但这似乎只是在对数据进行子集设置时发生的,之前只有具有相同名称("X-360"(的列,这是因为数据帧是从具有cbind的矩阵中设置的。以下是发生的事情的演示:

D1 <-matrix(rnorm(36),nrow=6)
colnames(D1) <- c("X-360", "X-400", "X-401", "X-300", "X-302", "X-500")
D2 <-matrix(rnorm(36),nrow=6)
colnames(D2) <- c("X-360", "X-406", "X-403", "X-300", "X-305", "X-501")
D <- cbind(D1, D2)
Data <- as.data.frame(D)
IDnames <- c("X-360", "X-302", "X-501")
Data[ ,colnames(Data) %in% IDnames]
X-360      X-302    X-360.1      X-501
1 -0.3658194 -1.7046575  2.1009329  0.8167357
2 -2.1987411 -1.3783129  1.5473554 -1.7639961
3  0.5548391  0.4022660 -1.2204003 -1.9454138
4  0.4010191 -2.1751914  0.8479660  0.2800923
5 -0.2790987  0.1859162  0.8349893  0.5285602
6  0.3189967  1.5910424  0.8438429  0.1142751

学会了在未来处理此类数据时要小心的另一件事。。。

这里的一个基于正则表达式的解决方案是形成精确关键字匹配的交替:

regex <- paste0("^(?:", paste(IDnames, collapse="|"), ")$")
Data[ , !grepl(regex, colnames(Data))]

最新更新