基于最小值的子集数据

时间:2015-09-03 13:50:05

标签: r subset dplyr plyr

这可能很容易。这是数据:

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

2 个答案:

答案 0 :(得分:4)

我们可以使用which.min对行进行子集化。在使用“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]

答案 1 :(得分: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