2016-01-12 89 views
1

我查找了類似的問題,但無法找到根據不同列中的數值選擇行的答案。我有一個數據集看起來像這樣(總共包括24個研究/列和超過28.000行)R編程:根據不同列中的數值選擇行

header <- c("symbol", "gene1", "gene2", "gene3") 
    study1 <- c("0.06", "0.01", "NA", "NA") 
    study2 <- c("0.09", "NA", "0.02", "0.08", "0.07") 
    study3 <- c("0.09", "NA", "NA", "0.1") 
    DF<- data.frame(header, study1, study2, study3, stringsAsFactors=FALSE) 
    DF 

    ID study1 study2 study3 
    1 gene1 0.06 0.09 0.09 
    2 gene2 0.01  NA  NA 
    3 gene3  NA 0.02  NA 
    4 gene4  NA 0.07 0.1 

>

我想打一個新的data.frame包括所有列,但只有其中的行對於至少一項研究(即一列),其值< = 0.05。 NA可因爲我是一個R編程初學者被視爲> 0.05

,我只對一列開始寫代碼過濾簡單,通過採用正常工作「這」

new_DF<-DF[which(as.numeric(DF$study1)<=0.05),] 

直到我在這裏對我自己來說非常高興:-)然而,我如何適應多列?我想包含一個通配符 「*」

new_DF<-DF[which(as.numeric(DF$study*)<=0.05),] 

,但我得到一個錯誤,指出「錯誤:意外 ')' 中的 「new_DF <-DF [其中(as.numeric(DF $研究*)」 我也是。嘗試使用dplyd包,子集或grep的功能,但總能得到類似的錯誤的消息不同的東西。

誰能幫我? 非常感謝!

回答

0

我們可以與至少一個值子集行時,通過使用rowSums小於或等於0.05。將數據集轉換爲邏輯矩陣(DF[-1] <= 0.05 - -1是刪除非數字的第一列)。上面的輸出將有TRUE/FALSE/NA。當我們使用na.rm=TRUE執行rowSums時,我們得到每行中小於或等於0.05的元素數的計數。對於第1行和第4行,沒有滿足條件的元素,所以總和將爲0,而對於其他的則不爲0.當我們否定(!)時,0將被轉換爲TRUE並且所有其他都爲FALSE。但是,我們需要刪除0行,所以再次否定將TRUE更改爲FALSE,反之亦然。然後,我們使用這個邏輯向量索引子集。

DF[!!rowSums(DF[-1] <= 0.05, na.rm=TRUE),] 
#  ID study1 study2 study3 
#2 gene2 0.01  NA  NA 
#3 gene3  NA 0.02  NA 
+0

對不起以前的評論是錯誤:-) 我的預期產出是行的子集,所以第一個選項。 但是,我恐怕會鬆動1列中<= 0.05的行,但在其他情況下> 0.05,否? 我不完全理解你寫的代碼,認爲 - 「!!」是什麼意思?代表? 「!」是倒轉/消極我想,所以這會是雙重否定的?或者這是否意味着你拿走了所有行的總和,但考慮每個值本身? - [-1]意味着你不考慮第一列的選擇(因爲它是ID)? – khardies

+0

@khardies我加了一些解釋。 – akrun

+1

非常感謝,我知道我嘗試將此應用於類似問題:-) – khardies

0

我想你的問題是你有大量的研究,對吧?你可以不喜歡這樣,但有可能是一個更好的辦法:

header <- c("symbol", "gene1", "gene2", "gene3") 
study1 <- c("0.06", "0.01", "NA", "NA") 
study2 <- c("0.09", "NA", "0.02", "0.08") 
study3 <- c("0.09", "NA", "NA", "0.1") 
DF<- data.frame(header, study1, study2, study3, stringsAsFactors=FALSE) 


nrstudies <-3 #change the number of studies to fit your study 
text <- "" 
formtext <-"(DF$studyNR <= 0.05)" 

for(i in 1:nrstudies){ 
    newtext<-gsub("NR",i,formtext) # substitutes the Substring "NR" for i 

if(i!=1){ 
      text<- paste(text, newtext, sep="|") 
}else{ 
      text <- newtext 
} 
} 

DF <- DF[eval(parse(text=text)),] 
+3

解析就像在R中for循環:大多數情況下,它們不是答案。 – Heroka

+1

我剛剛看到了更好的解決方案!你每天都會學到一些東西...... –

相關問題