根据最小值对数据进行子集筛选

3
这可能是一个简单的问题。以下是数据:
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

我打算获得一个类似下面的表格,它会给我最小距离(ID中存在重复)对应的Seg
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
2个回答

6

我们可以使用which.min来筛选行。在按'ID'分组后,我们根据最小'Distance'的位置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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接