2015-08-30 79 views
0

我需要提取最小值和最大值之間的觀察值數。我知道我可以對數據進行子集化,創建一個新的DF,然後計算長度,但是對較少涉及的過程感興趣。例如,我有和想要從最小到最大的觀察次數,R:最小值和最大值之間的obs數

ddd <- mydf[,list(minVar1 = min(Var1, na.rm=TRUE), 
     maxVar1 = max(Var1, na.rm=TRUE)), by="Group"] 

是否有沒有中間DF的直接方法?謝謝。

編輯:我想這比原先說過的要複雜一點。對於Group = 1,最小值實際上是2,但是我需要最小索引值低於最大值索引/位置。因此,該範圍爲3到7,長度爲3. Idx變量對Var1的測量指標/位置進行評分。因此,必須首先確定Var1的最大位置,然後確保從Idx中提取的最小位置小於最大位置的位置。

Group Var1 Idx 
1 3 4 
1 5 5 
1 7 6 
1 3 7 
1 2 8 
2 5 12 
2 6 13 
2 9 14 
2 11 15 
2 5 16 

Group min max length 
1 3 7 3 
2 5 11 4 
+3

看起來你正在使用'data.table'語法。請顯示一些示例和預期輸出。 – akrun

+0

有趣的問題。這裏是一個帶有'mtcars'數據集的基本R解決方案(例如變量'hp'):'length(unique(mtcars [order(mtcars $ hp),「hp」]))' – SabDeM

+0

如果有關係?觀察次數不清楚。 – akrun

回答

2

通過使用data.table,我們可以得到預期的輸出。我們將'data.frame'轉換爲'data.table'(setDT(df1))。按'Group'分組,我們order'Idx',得到'Var1'('ind')的最大值的位置,然後我們得到'Var1'的最小值低於'ind'的位置( 'IND2')。我們通過索引'Var2'上的'ind2'和'ind'來總結和創建列'min'和'max',而'length'是通過使用相同的'ind',' IND2' 並加入1

library(data.table) 
setDT(df1)[order(Idx), {ind <- which.max(Var1) 
         ind2=which.min(Var1[seq(ind)]) 
         list(min=Var1[ind2], 
          max=Var1[ind], 
          length=Idx[ind]-Idx[ind2]+1)} , Group] 
# Group min max length 
#1:  1 3 7  3 
#2:  2 5 11  4 
+0

謝謝。我會試一試。它看起來像我在接下來的幾個星期前嘗試'maxVar1 < - mydf [,.SD [which.max(Var1)],by =「Group」]','maxIdxVar1 < - maxindexVar1 [,list(Group,Idx)]' ,'minVar1 < - mydf [,.SD [which.min(Var1)],by =「Group」]','minIdxVar1 < - minindexVar1 [,list(Group,Idx)]'。所以,這只是識別Var1的最小和最大Idx。 – ksing

+0

@ksing我根據您的意見更改了代碼。 – akrun

+1

謝謝,那是有效的。 – ksing

2

使用dplyr

library(dplyr) 
dat %>% group_by(Group) %>% 
     summarise(min = min(Var1[1:which.max(Var1)]), 
        max = max(Var1), 
        diff = 1 + which.max(Var1) - which.min(Var1[1:which.max(Var1)])) 

Source: local data frame [2 x 4] 

    Group min max diff 
1  1 3 7 3 
2  2 5 11 4 
+0

謝謝。我會試試這個。 – ksing

相關問題