我正在尝试使用数字向量从数据框中删除列,这些数字只是整个列标题的一部分。我想要使用的东西就像通配符" *"在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;或者是下划线之后的内容。我已经阅读了很多关于使用正则表达式的答案,而我似乎无法解决这个问题。任何想法,或指向我可能会转向的内容都将不胜感激。
答案 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))