2015-09-03 152 views
1

這可能很簡單。這裏的數據:基於最小值的子集數據

dat <- read.table(header=TRUE, text=" 
Seg ID Distance 
Seg46  V21 160.37672 
Seg72  V85 191.24400 
Seg373  V85 167.38930 
Seg159  V147 14.74852 
Seg233  V171 193.01636 
Seg234  V171 200.21458 

        ") 
dat 
Seg ID Distance 
Seg46  V21 160.37672 
Seg72  V85 191.24400 
Seg373  V85 167.38930 
Seg159  V147 14.74852 
Seg233  V171 193.01636 
Seg234  V171 200.21458 

我打算讓這樣會給我Seg的最小距離(如重複數據刪除在ID看到下面的表

Seg Crash_ID Distance 
Seg46  V21 160.37672 
Seg373  V85 167.38930 
Seg159  V147 14.74852 
Seg233  V171 193.01636 

我想使用ddply來解決它,但它沒有達到有

ddply(dat, "Seg", summarize, min = min(Distance)) 
Seg  min 
Seg159 14.74852 
Seg233 193.01636 
Seg234 200.21458 
Seg373 167.38930 
Seg46 160.37672 
Seg72 191.24400 

回答

4

我們可以which.min子集的行GROUPI後。用'ID',我們slice基於最小'距離'的位置的行。

library(dplyr) 
dat %>% 
    group_by(ID) %>% 
    slice(which.min(Distance)) 

使用data.table類似的辦法是

library(data.table) 
setDT(dat)[, .SD[which.min(Distance)], by = ID] 
2

如果你喜歡ddply你可以這樣做

library(plyr) 
ddply(dat, .(ID), summarize, 
     Seg = Seg[which.min(Distance)], 
     Distance = min(Distance)) 

# ID Seg Distance 
#1 V147 Seg159 14.74852 
#2 V171 Seg233 193.01636 
#3 V21 Seg46 160.37672 
#4 V85 Seg373 167.38930