2014-05-13 55 views
0

我對R環境有點新鮮。 我有一套「測試」字符。如果我想從樣本數據(數字)中過濾掉所有相應的列值,我可以通過匹配列名來完成。
如何過濾R中相似(不相同)行名的值

> test <-c("aa", "bb", "zz") 

> head(sample.data) 

aa aa-001 aa-099 cc zz 

1 5  6  7 2 

> temp<-test%in% names(sample.data) 

這給了我,我可以用它來獲取需要的數據

>temp 

TRUE FALSE FLASE FLASE TRUE 

> req.vec <- sample.data[temp] 


> req.vec 


aa zz 


1 2 

但是邏輯載體,是有可能,與AA的值一起,我還可以過濾掉aa-001和aa-099的相應值也是如此?我無法企及的「AA」的所有變種,因爲數據甲肝爲AA變化100S,BB ZZ等

+0

您想如何更改樣本數據的結果?你是否說你想保留每一個以「aa」開頭的專欄? – MrFlick

+0

嗨,是的,我想生成一組數據,其中包含具有相同初始名稱的所有列的值。實際上,只有最後四個字符因不同的列名而改變。例如。如果列名是aa-001 aa-005 bbb-001 bbb-090 acdb-001 acdb-007等,我對那些包含「aa」和「acdb」的值感興趣等。 –

回答

0

如果他們colnames總是給定的格式,你可以做

test <-c("aa", "bb", "zz") 
cn <- c("aa", "aa-001", "aa-099", "cc", "zz") 
sample.data <- c(1,5,6,7,2) 
names(sample.data) <- cn 
sample.data[substr(cn, 1, 2) %in% test] 
## aa aa-001 aa-099  zz 
##  1  5  6  2 

另外,您您可以迭代greptest

+0

謝謝!我需要稍微修改一下。根據我的問題,只有最後4個字符正在改變。 因此,使用 sample.data [substr(cn,1,2)%in%test] 我使用了sample.data [substr(cn,1,nchar(cn)-4))%test ] –

0

本示例使用grep來匹配任何以test向量中的字符開頭的列名稱。

test <- c("aa", "bb", "zz") 
sample.data <- data.frame(aa=1, "aa-001"=5, "aa-099"=6,cc=7,zz=2) 
cols <- apply(sapply(test, function(x) grepl(paste0("^",x),names(sample.data))),1,any) 
sample.data[, cols] 

既然你提到,只有最後4個字符都在變化,話很有道理,除去最後4個字符

sample.data <- data.frame("aa-001"=1, "aa-005"=5, "bbb-001"=6, 
    "bbb-090"=7,"acdb-001"=2, "acdb-007"=1) 
test <- c("aa","acdb") 
nn <- names(sample.data) 
cols <- substr(nn,1,nchar(nn)-4) %in% test 
sample.data[,cols] 

或者,如果你想刪除任何東西,在結尾的「 - 」和一些數字,您可以使用gsub

sample.data <- data.frame("aa-001"=1, "aa-005"=5, "bbb-001"=6, 
    "bbb-090"=7,"acdb-001"=2, "acdb-007"=1, check.names = FALSE) 
test <- c("aa","acdb") 
cols <- substr(nn,1,nchar(nn)-4) %in% test 
sample.data[,cols] 
+0

這就是我所做的。剛發佈我的語法後看到您的回覆。無論如何,非常感謝您的回覆:) –

相關問題