2013-08-02 60 views
0

我有一個表,開始低於:如何分類和處理數據

    Control_H1455_121005_4  Case_X1456_121005_1  Case_V1457_121005_7  Control_K1461_121005_2 
ENSG00000419.8      0     0     14     3 
ENSG00000457.8      2     0     1      0 
ENSG00000460.11     18     3     16     6 
ENSG00000938.7      0     0     0      0  

更新:

  1. 首先,我想改變colnames。只有第二個下劃線之前的部分很重要,例如在Control_H1455_121005_4中,我想將其縮短爲Control_H1455。這是我的代碼到目前爲止:

    gsub("^.*?_","_","Case_H1455_121005_4") 
    

    但是,這返回"_H1455_121005_4"。我想保留的部分實際上是Case_H1455。所以我只想保留所有的字符,直到第二個下劃線

    更新:對(2),我有以下代碼:

    #separating data into Control & Case groups 
    data_con=data[which(substring(names(data),2,2) %in% c("o"))] 
    data_case=data[which(substring(names(data),2,2) %in% c("a"))] 
    
    #delete rows if both case and control groups have >= 90% cols that contain 0 
    #data <- data[(rowSums(data_case==0)/ncol(data_case) < 0.9 & rowSums(data_con==0)/ncol(data_con) < 0.9) , ] 
    

    這似乎是工作。

  2. 我想通過每行進行過濾並將該行中的數據分爲兩組:控制和案例。然後,我想要刪除一個行當且僅當它滿足以下條件:> = = 90%的列在條件控制組中都包含0。因此,在此示例表中,爲了刪除一行,組和控件都必須包含大於或等於90%的包含0的列。所以這裏是最後一行。如果案例組包含> = 90%的cols有0,但對照組有< 90%cols與0(反之亦然),那麼應保留該行。要做到這一點,我目前有以下代碼:

    data <- data[rowSums(data==0)/ncol(data) < 0.9, ] 
    

    但這並不是按照Case和Control分隔每一行,而是分別查看每個組。

請記住,實際數據中還有更多列和行,並且控件和案例從列到列隨機出現。

因此,任何數字(1)的幫助將不勝感激!

+0

如何爲(1)從不同的[您剛纔的問題(http://stackoverflow.com/問題/ 17970287/R-如何到變化最列名功能於一個數據幀爲基礎上-A-規範)? – Thomas

+0

對於(2),你必須'rowSums'使用哪些列。 – Thomas

+0

對於(1)我想刪除部分的colname,而不是替換「SM」部分。我有'gsub(「^。*?_」,「_」,「Case_H1455_121005_4」),但它給出了「_H1455_121005_4」這是第一個下劃線之後的部分。但是我希望** ** ** 2nd **下劃線之前的部分**。所以它應該是'Case_H1455'。有什麼建議麼? (2)的 – zfz

回答

1

我不確定,但我認爲這將有助於...

# 1) 
# assuming that the structure of "_" does not change 
colnames(data) <- sapply(colnames(data), 
         function(x){ 
          paste(unlist(strsplit(x, "_"))[1:2], collapse = "_") 
              }) 
# 2) 
# to sperate case and control 
ind <- grepl("Case", colnames(data)) 

# assuming that there are at lesast tow cases and tow control 
# otherwise use sum and length 
data[rowSums(data[, !ind]==0)/ncol(data[, !ind]) < 0.9 & 
    rowSums(data[, ind]==0)/ncol(data[, ind]) < 0.9, ] 

H個

+0

是的,這就是我一直在尋找!非常感謝 :-) – zfz