2015-12-09 1 views
0

Предполагая, что ниже данныхКак GROUP и выбрать наименьшее значение в R

OriginId, OriginName, DestinationId, DestinationName,Time 
1  , Origin 1, 1  ,   Destination 1 , 20 
1  , Origin 1, 2  ,   Destination 2 , 25 
2  , Origin 2, 3  ,   Destination 3 , 14 
2  , Origin 2, 4  ,   Destination 4 , 29 

Это CSV, который проводит время в пути между пунктами происхождения и назначения. Я хочу найти ближайший пункт назначения по происхождению. Другими словами, я должен сгруппировать данные по OriginId и дать ранг каждой группе на основании времени и получить те строки, которые получили ранг 1. Таким образом, желаемый результат для приведенных выше данных является:

OriginId, OriginName, DestinationId, DestinationName,Time(Minute) 
1  , Origin 1, 1  ,   Destination 1 , 20 
2  , Origin 2, 3  ,   Destination 3 , 14 

Какая функция R мне нужно использовать после группы?

ответ

3

Используя dplyr, можно сгруппировать с помощью «OriginId», а затем получить индекс строки из «Time», который имеет минимальное «время» с which.min, извлечь эту строку с slice.

library(dplyr) 
df1 %>% 
    group_by(OriginId) %>% 
    slice(which.min(Time)) 

Или, если мы рассмотрим использование data.table, преобразовать 'data.frame' в 'data.table' (setDT(df1)), сгруппированных по 'OriginId', мы получим индекс строки (как в в предыдущем случае) и подмножество строк набора данных (.SD).

library(data.table) 
setDT(df1)[, .SD[which.min(Time)], by = OriginId] 
+2

Спасибо, можно ли добавить немного деталей к вашему ответу? – Shahin

+1

@shaahin Извините, была некоторая проблема с javascript в моем браузере, который помешал мне обновить описание. Теперь он обновляется. – akrun

Смежные вопросы