2015-01-20 32 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))