2016-08-04 71 views
0

我有一個具有〜4000行基因表達式的數據集。如何刪除在R的所有列中具有相同值的行

DF<-read.table("Sample_DF.txt",header=T) 
head(DF, 4) 


# Gene_Symbol  X.U1.  X.T1.  X.U2.  X.T2. 
# 1  M1AP 0.0440509 0.1164950 0.0574035 0.0000000 
# 2  DRD4 0.0440114 0.0387834 0.0512446 0.0497801 
# 3  PCA3 0.0439278 0.0258183 0.0000000 0.0329761 
# 4  FAM153B 0.0439073 0.0409539 0.0658340 0.3767400 

tail(DF, 4) 

#  Gene_Symbol X.U1. X.T1. X.U2. X.T2. 
# 3992 LINC00353  0  0  0  0 
# 3993 LINC00359  0  0  0  0 
# 3994 LINC00366  0  0  0  0 
# 3995 LINC00379  0  0  0  0 

現在,我想刪除所有列中包含0的所有行。 我已經通過這裏所有類似的查詢,並在其他網站的搜索和使用的代碼:

DF_filtered <- DF[!apply(DF[,c(2:5)],1,function(z) all(z==0)),] 

DF_filtered <- DF[apply(DF[,c(2:5)],1,function(z) all(z!=0)),] 

DF_filtered <- DF[apply(DF[,c(2:5)],1,function(z) any(z!=0)),]. 

然而,沒有工作,沒有線正在從原始數據集中刪除。有人可以幫我解決這個問題。

+1

嘗試在read.table(na.strings =「0」)中讀取設置。它會將數據幀中的所有0都轉換爲NAs,然後你可以使用'na.omit(DF)' – Nate

+0

作爲將來的參考,你應該發佈一個'dput(sample_DF)',這樣每個有幫助的人都可以確保解決方案適用於您的具體案例 – Nate

+2

我與@NathanDay就此事達成了共識,但是如果您已經堅持使用加載的數據,我會使用'''df [!Reduce('&',lapply(df [-1],'==',0)),]''' –

回答

3

如果你沒有在列負值可以篩選根據符合的rowSums條件等於0

假設您的數據行的索引你的數據框被稱爲df

df <- df[-which(rowSums(df[2:5])==0), ]

編輯 - 包括基於TRUE/FALSE,而不是一個索引,可能潛在地是空的矢量的矢量由@akrun濾波建議更安全的方式:

df <- df[!rowSums(df[2:5])==0, ]

+0

正如你所建議的:我試過這個選項DF_filtered < - DF [-which(DFs [2:5])== 0),]但在rowSums(DF [2:5])中出現錯誤錯誤:'x '必須是數字 – Debbie

+0

這4列是數字嗎?你可以用'str(DF)'來檢查。 'rowSums'不適用於字符或因子列。 – Warner

+0

非常感謝,在我的原始數據第二欄是染色體的位置,這就是我原來的代碼沒有工作的原因。感謝您指出。我可以成功地過濾我的數據。 – Debbie

相關問題