This might an easy one. Here\'s the data:
dat <- read.table(header=TRUE, text=\"
Seg ID Distance
Seg46 V21 160.37672
Seg72 V85 191.24400
Seg37
We can subset the rows with which.min. After grouping with 'ID', we slice the rows based on the position of minimum 'Distance'.
library(dplyr)
dat %>%
group_by(ID) %>%
slice(which.min(Distance))
A similar option using data.table would be
library(data.table)
setDT(dat)[, .SD[which.min(Distance)], by = ID]
If you prefer ddply you could do this
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