如何使用带正则表达式的向量从数据框中删除数据列

时间:2017-03-31 20:17:30

标签: r bioinformatics

我正在尝试使用数字向量从数据框中删除列,这些数字只是整个列标题的一部分。我想要使​​用的东西就像通配符" *"在unix中,这样我就可以说我想删除带有标签 xxxx xxkx 等的列...为了说明我的意思,如果我有以下数据:

data_test_read <- read.table("batch_1_8c9.structure-edit.tsv",sep="\t", header=TRUE)
data_test_read[1:5,1:5]
samp pop X12706_10 X14223_16 X14481_7
1 BayOfIslands_s088.fq   1         4         1        3
2 BayOfIslands_s088.fq   1         4         1        3
3 BayOfIslands_s089.fq   1         4         1        3
4 BayOfIslands_s089.fq   1         4         3        3
5 BayOfIslands_s090.fq   1         4         1        3

我想拿出带标题的列(X12706_10,X14481_7),以下作品

data_subs1=subset(data_test_read, select = -c(X12706_10, X14481_7))
data_subs1[1:4,1:4]
samp pop X14223_16 X15213_19
1 BayOfIslands_s088.fq   1         1         3
2 BayOfIslands_s088.fq   1         1         3
3 BayOfIslands_s089.fq   1         1         3
4 BayOfIslands_s089.fq   1         3         3

但是,我需要的是能够仅通过数字来识别这些列,因此,使用(12706,14481)。但是,如果我尝试这个,我得到以下

data_subs2=subset(data_test_read, select = -c(12706,14481))
data_subs2[1:4,1:4]
samp pop X12706_10 X14223_16
1 BayOfIslands_s088.fq   1         4         1
2 BayOfIslands_s088.fq   1         4         1
3 BayOfIslands_s089.fq   1         4         1
4 BayOfIslands_s089.fq   1         4         3

这显然是因为我没有指定与&#34; x&#34;或&#34; _&#34;或者是下划线之后的内容。我已经阅读了很多关于使用正则表达式的答案,而我似乎无法解决这个问题。任何想法,或指向我可能会转向的内容都将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,您可以从标题中提取数字

# for testing
col_names <- c("X12706_10","X14223_16","X14481_7")
# in practice, use
# col_names <- names(data_test_read)
samples <- gsub("X(\\d+)_.*","\\1",col_names)

找到要删除的样本的索引。

samples_to_drop  <- c(12706, 14481)
cols_to_drop <- match(samples_to_drop, samples)

然后你可以使用

data_subs2 <- subset(data_test_read, select = -cols_to_drop)

实际上摆脱那些列。

或许把这一切都放在一个功能中,以便于使用

sample_subset <- function(x, drop) {
    samples <- gsub("X(\\d+)_.*","\\1", names(x))
    subset(x, select = -match(drop, samples))
}
sample_subset(data_test_read, c(12706, 14481))