2016-07-15 47 views
0

我的數據框(bact)有〜4500行(細菌分類羣)和19個有用的列(主要是樣本)。這是包含多個樣品列(p'x')中的rankID信息(有序因子)和基因匹配的基因組學數據的輸出,以及跨分類羣(總數)的具有基因匹配總和的列。我打算在對行進行清理後轉換爲「長」格式。使用有序因子過濾大型數據集,條件是R中的其他值與dplyr?

問題是:有許多重疊的類羣(具有分類(名稱更高級別分類單元是未分類,和較低級的分類單元)),並用於下游數據分析和繪圖的目標是有系統發育與數據相關的相關分類單元描述(在這種情況下是基因匹配)。

例如

rankID    taxon   total  
0.2.1    Acidobacteria 994577 
0.2.1.1   Acidobacteria 917570 
0.2.1.1.1   11B-2   3 
0.2.1.1.1.1  unclassified 3 
0.2.1.1.1.1.1  unclassified 3 
0.2.1.1.2   AT-s3-28  2975 
0.2.1.1.2.1  unclassified 2975 
0.2.1.1.2.1.1  unclassified 2975 

我想刪除具有在「總」列中的值相同,並且所有行較高「rankID」(在這種情況下:0.2。 1.1.1; 0.2.1.1.1.1; 0.2.1.1.2.1; 0.2.1.1.2.1.1)。 注意:我不想刪除所有分類中的'未分類',因爲有時這些實際上是必須保留的。

以下是我認爲可能的工作:

bact<- read.csv('cSSU_bacteria_full.csv') 
str(bact) 
bact$rankID <- factor(bact$rankID, ordered = TRUE) 

library(dplyr) 

bact %>% 
    filter(!(any(order(levels(rankID)) < order(levels(rankID)) & total == total))) 

的目標是去除冗餘行,保持在總量相等的最低級的分類單元,因此消除分類單元互相解釋,但一個分類(有一個名字),其他的不是。

在此先感謝。

回答

0

您的rankID有兩個組件。第一個是RankID是多少。例如,第二行的字符串長度爲7.我們可以利用這個優勢。根據以上數據,字符數最多的總數是最低的等級。

另一個組件是rankID中的數字之和。沒有等級具有相同的字符長度和相同的數字總和。幸運的是,要做到這一點,我們只需要字符串長度。

要做到這一點,你需要確保rankID實際上是一個字符串,而不是一個因素。

bact %>% 
mutate(StringLength = nchar(rankID, type = 'char')) %>% 
group_by(total) %>% 
filter(StringLength == max(StringLength)) 

這應該是訣竅。