2013-06-21 59 views
0

我有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" 

該規範是,我想的是開始的SNP與「RS」從與開始的SNP分離「CNV」,並且獲得兩種類型的SNPS中的每一種的新矩陣及其相應的Pi1值。 SNP的名稱都是隨機的,因此「rs」或「CNV」將隨行出現在逐列的列中。

我想我可能需要一個for循環來運行SNP列中每個條目的前2個字符,但我不知道這是正確與否。

+0

...爲什麼你的數據是一個矩陣而不是數據框?你確定你輸入正確嗎? –

+0

im不知道。我總是使用'data < - read.table()'導入數據。這是否會將我的數據作爲矩陣或data.frame?有沒有區別? – zfz

+0

對。您需要使用'read.table(*,header = TRUE)'導入。看到矩陣的第一行?這些是你的列名。如果沒有'header = TRUE'位,R會將它們視爲數據的一部分。除了給你一個虛假的行之外,它還搞亂了第二列,這個列已經作爲文本導入而不是數字,我猜它應該是什麼。 –

回答

1

使它成爲一個data.frame然後做到這一點:

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

這個作品是mylabel僅將GSUB後保留在第一列的字母標識符的方式。然後拆分將基於這些標識符將您的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 
+0

謝謝,我只是試過這個,它給了我一個錯誤:錯誤:意外的符號在「mylabel < - gsub(」[^ [:digit:]]「,」「)list.of.dfs」 – zfz

+0

我喜歡這個因爲它兜售了一張清單的概念,至少從長遠來看,我發現它更方便。 @zfzhao有兩行代碼(我只是重新格式化了它)。再試一次。 –

+0

道歉,我有點倉促。我修好了。 – asb

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尋找你的模式,「^」檢查,該模式是在開始。

+0

這段代碼調用了什麼?我進入了它,但我應該打電話來獲得最終結果? – zfz

+0

對不起,我開始製作一個像你的矩陣,我稱之爲「a」。然後我創建了2個僅包含rs(稱爲「rs」)並且僅包含cnv(稱爲「cnv」)的新矩陣對象。你只需要最下面兩行,並將矩陣的名稱替換爲「a」 – ping