2015-09-03 2 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.. ng с '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