2012-11-16 65 views
4

我對R非常陌生,主要用於使用ggplot2庫來可視化統計信息。現在我面臨數據準備的問題。從數據幀中提取具有最高和最低值的行

我需要編寫一個函數,它將從數據框中刪除一些數字(2,5或10)的行,這些數據框在指定列中具有最高和最低值,並將它們放入另一個數據框,然後爲每個兩個因素的組合(在我的情況下:每天和服務器)。

到目前爲止,我已經完成了以下步驟(MWE使用esoph示例數據集)。

esoph<-esoph[with(esoph,order(-ncontrols)) ,] 

我可以顯示針對每個因子值的第一/最後一個記錄(在本例爲每個年齡範圍)::

我已經根據所需的參數(ncontrols示例中)排序的幀

by(data=esoph,INDICES=esoph$agegp,FUN=head,3) 
by(data=esoph,INDICES=esoph$agegp,FUN=tail,3) 

所以基本上,我可以看到最高和最低值,但我不知道如何將它們提取到另一個數據幀以及如何從主要的一個刪除它們。

此外,在上述例子中,我可以看到頂部/底部記錄的一個因素(年齡範圍)的每個值,但在現實中,我需要知道的最高和最低記錄的因素的每個值 - 在這例如他們可能是agegpalcgp

我甚至不確定上述步驟是否正常 - 也許使用plyr會更好?我會很感激任何提示。

+0

所以,你只是想刪除一個數據幀的第一個和最後一個X行,並創建包含這些行的第二個數據幀? –

+0

不是簡單的第一個和最後一個,而是兩個因素的每個組合的最高和最低值(來自一列的值)。因此,對於兩天和兩臺服務器,我需要top1,server1的server1和server2的最低值爲5,server2和server2的最高值和最低值爲5。 –

回答

3

是的,你可以使用plyr如下:

esoph <- data.frame(agegp = sample(letters[1:2], 20, replace = TRUE), 
        alcgp = sample(LETTERS[1:2], 20, replace = TRUE), 
        ncontrols = runif(20)) 

ddply(esoph, c("agegp", "alcgp"), 
     function(x){idx <- c(which.min(x$ncontrols), 
          which.max(x$ncontrols)) 
        x[idx, , drop = FALSE]}) 
# agegp alcgp ncontrols 
# 1  a  A 0.03091483 
# 2  a  A 0.88529790 
# 3  a  B 0.51265447 
# 4  a  B 0.86111649 
# 5  b  A 0.28372232 
# 6  b  A 0.61698401 
# 7  b  B 0.05618841 
# 8  b  B 0.89346943 

ddply(esoph, c("agegp", "alcgp"), 
     function(x){idx <- c(which.min(x$ncontrols), 
          which.max(x$ncontrols)) 
        x[-idx, , drop = FALSE]}) 
# agegp alcgp ncontrols 
# 1  a  A 0.3745029 
# 2  a  B 0.7621474 
# 3  a  B 0.6319013 
# 4  b  A 0.3055078 
# 5  b  A 0.5146028 
# 6  b  B 0.3735615 
# 7  b  B 0.2528612 
# 8  b  B 0.4415205 
# 9  b  B 0.6868219 
# 10  b  B 0.3750102 
# 11  b  B 0.2279462 
# 12  b  B 0.1891052 

有可能是許多替代方案,例如如果您的數據已經排序,則使用headtail,但這應該有效。

1

使用基礎R:

newesoph <- esoph[esoph$ncontrols == ave(esoph$ncontrols,list(esoph$agegp,esoph$alcgp),FUN = max) 
     | esoph$ncontrols == ave(esoph$ncontrols,list(esoph$agegp,esoph$alcgp),FUN = min), ] 
相關問題