2015-11-04 19 views
0

假設我有一個包含2個變量的數據框,我試圖運行一些基本的彙總統計信息。我想運行一個循環來給我每個唯一的數字值的最小和最大秒數值之間的差異。我的實際數據框很龐大,包含很多'數字'的值,所以單獨進行子集和運行並不是一個現實的選擇。數據是這樣的:如何在同一數據的不同部分上運行循環。框架

df <- data.frame(number=c(1,1,1,2,2,2,2,3,3,4,4,4,4,4,4,5,5,5,5), 
       seconds=c(1,4,8,1,5,11,23,1,8,1,9,11,24,44,112,1,34,55,109)) 
    number seconds 
1  1  1 
2  1  4 
3  1  8 
4  2  1 
5  2  5 
6  2  11 
7  2  23 
8  3  1 
9  3  8 
10  4  1 
11  4  9 
12  4  11 
13  4  24 
14  4  44 
15  4  112 
16  5  1 
17  5  34 
18  5  55 
19  5  109 

我當前的代碼只返回整個數據FRAM的最小值和最大值秒之間的差值:

ZZ <- unique(df$number) 
for (i in ZZ){ 
     Y <- max(df$seconds) - min(df$seconds) 
} 
+0

爲什麼你需要一個循環?在這裏聚合可能會更好。或者任何'按照某種事情做'某些事情的庫,比如dplyr或data.table。 – Heroka

+0

謝謝@賀岡。雖然下面的代碼完全符合我想要的內容,但該線程應該證明是有用的。 –

回答

3

既然你有大量的數據表現應該的問題你應該使用data.table而不是data.frame:

library(data.table) 
dt <- as.data.table(df) 
dt[, .(spread = (max(seconds) - min(seconds))), by=.(number)] 

    number spread 
1:  1  7 
2:  2  22 
3:  3  7 
4:  4 111 
5:  5 108 
+0

完美而優雅。非常感謝你。 –

+2

或只是'setDT(df)[,max(seconds)-min(seconds),by = number]' – Cath

+0

或者只是'setDT(df)[,diff(range(seconds)),by = number]' –

相關問題