如何根据规范分离列中的行?

时间:2013-06-21 09:35:29

标签: r row multiple-columns bioinformatics

我有一个包含2列的矩阵,矩阵的开头如下所示:

          SNP           Pi1         
[1,] "SNP_Label"   "Pi1"         
[2,] "rs482519"    "0.3722219"   
[3,] "rs12196956"  "0.3212364"   
[4,] "CNV548726"    "0.3112315"   
[5,] "CNV356212"    "0.3078721"   
[6,] "rs4792617"   "0.3023402"   
[7,] "CNV2095401"   "0.2979626"   
[8,] "CNV4528251"   "0.29391"     
[9,] "rs9369426"   "0.2860793"   
[10,] "rs31672"     "0.2790241"   
[11,] "rs1323446"   "0.2778401"   

规范是我想从以“ CNV ”开头的SNP中分离以“ rs ”开头的SNP,并为每个SNP获取一个新矩阵SNPS的两种类型及其相应的Pi1值。 SNP的名称都是随机的,因此“rs”或“CNV”将在行与行之间随机出现。

我想我可能需要一个for循环来运行SNP列中每个条目的前2个字符,但我不知道这是对的。

2 个答案:

答案 0 :(得分:1)

将其设为data.frame,然后执行以下操作:

mylabel <- gsub("[0-9]", "", my.df[[1]])
list.of.dfs <- split(my.df, mylabel)

这样做的方法是mylabel只会在gsub之后的第一列中保留字母标识符。然后,split会根据这些标识符将您的data.frame分成块。

将为您提供包含所有唯一标签的data.frames列表。之后您可以选择带有“rs”和“CNV”名称的名称。

$CNV
      V1        V2
3  CNV548726 0.3112315
4  CNV356212 0.3078721
6 CNV2095401 0.2979626
7 CNV4528251 0.2939100

$rs
       V1        V2
1    rs482519 0.3722219
2  rs12196956 0.3212364
5   rs4792617 0.3023402
8   rs9369426 0.2860793
9     rs31672 0.2790241
10  rs1323446 0.2778401

答案 1 :(得分:0)

a <- data.matrix(cbind(c("rs1","CNV1","rs2","CNV2"),c("a","b","c","d")))
rs <- a[grep("^rs",a),]
cnv <- a[grep("^CNV",a),]

使用grep查找模式,“^”检查模式是否在开始。