2017-03-31 18 views
0

我想從數據框中刪除使用數字向量的列,這些數字只是整個列標題的一部分。我想要使​​用的是像unix中的通配符「*」,所以我可以說,我想要刪除帶有標籤的列xxxxxxkx等...爲了說明我的意思,如果我有以下數據:如何使用帶有正則表達式的向量從數據框中刪除數據列

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 

這顯然是因爲我還沒有指定什麼關係的「X」,或「_」或什麼是下劃線後。我已經閱讀了很多關於使用正則表達式的答案,而我似乎無法將其整理出來。任何想法,或指向我可能會轉向,將不勝感激。

回答

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)) 
相關問題