基于最小值的子集数据

S D*_*Das 3 r subset plyr dplyr

这可能是一件容易的事。这是数据:

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
Run Code Online (Sandbox Code Playgroud)

我打算得到一个像下面这样的表,它会给我Seg最小的距离(因为重复在ID.

Seg Crash_ID  Distance
Seg46      V21 160.37672
Seg373      V85 167.38930
Seg159     V147  14.74852
Seg233     V171 193.01636
Run Code Online (Sandbox Code Playgroud)

我试图用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
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

我们可以使用 对行进行子集化which.min。用“ID”分组后,我们slice根据最小“距离”的位置排列行。

library(dplyr)
dat %>% 
   group_by(ID) %>% 
   slice(which.min(Distance))
Run Code Online (Sandbox Code Playgroud)

使用类似的选项data.table

library(data.table)
setDT(dat)[, .SD[which.min(Distance)], by = ID]
Run Code Online (Sandbox Code Playgroud)