2015-01-20 67 views
1

這在很大程度上是一個基本的問題,但我似乎無法弄清楚:子集R中基於共享字符的行名稱

我SNPS與R中相應的cosPvalue作爲一個列表數據幀稱爲snps

RS   cos  Pval 
1 rs31192577 -0.15583497 0.2241433 
2 rs32166183 -0.12573989 0.2934898 
3 rs30543887 -0.07852091 0.5141007 
4 rs6365082 0.55173702 0.1736945 
5 rs46229295 -0.10897376 0.3687622 
6 rs45964436   NaN 1.0000000 

然而,一些RS的被命名爲no_rs1no_rs2的情況下,沒有SNP名稱該位置。

我只是想在自己的名稱中「RS」和相應的cosPvaluesnps2數據幀過濾掉的那些(從而擺脫no_rs的人),但對我的愛,我可以」不像是會得到正確的語法:

snps2<-subset(snps, RS=="rs$") 

snps2<-subset(snps, RS=="rs*") 

不會做的伎倆......

我與子集的工作通常使用的數值限制,即

snps2<-subset(snps, Pval<0.05) 

確實是我所需要的 - 只給出那些Pval低於0.05的行,但我無法獲得rs過濾權。

任何幫助將不勝感激。

回答

2

嘗試以下操作:

df[grepl("^rs", df$RS),] 
2

我認爲你需要使用什麼grepl。訣竅是subset(或[運算符)都與邏輯向量一起工作。 subset環境只是簡單地引用data.frame的列,從那裏創建一個邏輯向量(正確長度)的任何東西都可以工作。

snps <- structure(list(RS = c("rs31192577", "rs32166183", "rs30543887", 
"no_rs6365082", "rs46229295", "no_rs45964436"), cos = c(-0.15583497, 
-0.12573989, -0.07852091, 0.55173702, -0.10897376, NaN), Pval = c(0.2241433, 
0.2934898, 0.5141007, 0.1736945, 0.3687622, 1)), .Names = c("RS", 
"cos", "Pval"), row.names = c(NA, -6L), class = "data.frame") 

由於您的數據只有rs*行,我會改的一對夫婦的效果:

snps$RS[c(4,6)] <- paste0('no_', snps$RS[c(4,6)]) 
snps 
##    RS   cos  Pval 
## 1 rs31192577 -0.15583497 0.2241433 
## 2 rs32166183 -0.12573989 0.2934898 
## 3 rs30543887 -0.07852091 0.5141007 
## 4 no_rs6365082 0.55173702 0.1736945 
## 5 rs46229295 -0.10897376 0.3687622 
## 6 no_rs45964436   NaN 1.0000000 

的子集,您是否使用[運營商或subset,可以使用grepl

subset(snps, grepl('^no_', RS)) 
##    RS  cos  Pval 
## 4 no_rs6365082 0.551737 0.1736945 
## 6 no_rs45964436  NaN 1.0000000 
## similarly: snps[grepl('^no_', snps$RS),] 

subset(snps, !grepl('^no_', RS)) 
##   RS   cos  Pval 
## 1 rs31192577 -0.15583497 0.2241433 
## 2 rs32166183 -0.12573989 0.2934898 
## 3 rs30543887 -0.07852091 0.5141007 
## 5 rs46229295 -0.10897376 0.3687622 
0

比較運算符==從字面上將snps$RS變量與字符串指定並不使用特殊字符。您可以使用正則表達式使用grepl函數解決您的問題。下面應該工作:

snps2 <- snps[grepl("^rs", snps$RS), ] 

,或者如果你喜歡使用subset功能:

snps2 <- subset(snps, grepl("^rs",snps$RS))