2012-12-02 30 views
1

我覺得我太累了,看不到錯誤。我寫了一個函數來獲得兩個數據集的最大值從「for」循環:保存for循環的結果在一個載體中

plot_zu <- function(x) {for (i in 1:x){ 
    z=data_raw[grep(a[i], data_raw$Gene.names),] 
    b=data_raw_ace[grep(a[i], data_raw_ace$Gene.names),] 
    p<-vector("numeric", length(1:length(a))) 
    p[i]<-max(z$t_test_diff) 
    return(p)} 
} 

試想一下:一個是名稱的向量和數據集(data_raw(_ace))被它過濾。最後,我想在向量中具有列t_test_diff的所有最大值。之後,我想從data_raw_ace中添加t_test_diff列值。

所以問題是,我得到這個:

[1] 1.210213 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 
[8] 0.000000 0.000000 

所以有與支架或東西的問題,但我看不到它(第一個值符合)。對不起,沒有好的例子,但我認爲這是可以理解的,並且很容易解決問題。

如果有需要,我可以添加其他的例子。

非常感謝!

感激,

亨德里克

+2

將'p <-vector(「numeric」,length(1:length(a)))'移到'for(i in 1:x)'之前,並將'return(p)'移到你的第一個'}'? – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab是的,工作,thx。是否有一個函數可以在不改變+或 - 的情況下獲得最大的負值/正值? :) – hendrik

+0

我猜你想獲得'max(abs(...))'值? –

回答

1

在缺乏數據,甚至您對這個函數的調用,我會根據我想你正試圖提供一種替代。看來你只想選擇那些「Gene.names」列值在「a」定義的集合中的那些「data_raw」行。如果是的話,那就是:

z <- data_raw[ data_raw$Gene.names %in% a , ] # no loop needed 

b <- data_raw_ace[ data_raw_ace$Gene.names %in% a , ] # again no loop needed 
# Next step is unclear 

如果你想使用grep或grepl內「[」,然後使用sapply:

z <- data_raw[ sapply(a, grep, x= data_raw$Gene.names), ] # (still) no loop needed 
b <- data_raw_ace[ sapply(a, grep, x= data_raw_ace$Gene.names), ] 

當你做到這一點,它是什麼,期望?

​​

如果你想在兩個數據子集的同名列中的最大值,那麼這樣做:基於以上我(現在)你進一步的評論

p <- pmax(z$t_test_diff, b$t_test_diff) 

想可能:

p <- apply(cbind(z$t_test_diff), abs(b$t_test_diff), 1, function(x) x[which.max(abs(x))]) 
+0

不錯,但我使用grep函數的原因是,它似乎在Gene.name列中有些條目是這樣的:App1; App2與%我沒有得到這些行,對吧? – hendrik

+0

請參閱進一步的建議。仍然不清楚子集完成後的任務是什麼。 –

+0

不錯的一個,另外一個問題:通過使用b < - data_raw_ace [sapply(a,grep,x = data_raw_ace $ Gene.names),]我得到一個箭頭按摩; Fehler在'[.default'(xj,i):ungültigerIndextyp'list'中,但我檢查了sapply函數,它的工作原理,似乎我必須更改類,但爲什麼? – hendrik

0

vapply這樣做,消除了for循環。未經測試。

vapply(1:x, FUN.VALUE=numeric(1), FUN=function(x) { 
    z=data_raw[grep(a[i], data_raw$Gene.names),] 
    b=data_raw_ace[grep(a[i], data_raw_ace$Gene.names),] # Is this needed? 

    return(max(z$t_test_diff)) 
}) 
1

看來你在每個新的迭代中通過在循環中定義它來覆蓋p。