2017-02-03 7 views
2

У меня есть большой блок данных с экспериментами с различными параметрами. Каждая комбинация параметров несколько казней:Как я могу оставить столбцы нетронутыми с агрегатом в R

PROFILE TIME NTHREADS PARAM1 PARAM2 PARAM3 
prof1 3.01 1  4  10  1 
prof1 2.90 1  4  10  1 
prof1 3.02 1  4  10  1 
prof1 1.52 1  4  10  2 
prof1 1.60 1  4  10  2 
... 

Я использую агрегат, чтобы получить лучшее время для каждой комбинации профиль & nthreads:

data_aggregated <- aggregate(data$TIME, 
          by = list(PROFILE = data$PROFILE, 
             NTHREADS = data$NTHREADS), 
          FUN = min) 

Это возвращает новый dataframe вроде этого:

PROFILE NTHREADS TIME 
prof1 1  1.52 
prof1 2  0.9 
prof2 1  1.41 
prof2 2  0.88 
... 

Я хочу получить значения PARAM1, PARAM2, PARAM3 для совокупной строки в каждом случае (один с минимальным временем). На данный момент я смотрю в первую строку данных строку, где PROFILE, TIME и NTHREADS равны тем, которые находятся во втором блоке данных, но, возможно, есть более простой способ?

+1

'which.min (TIME)' также должны работать для вас –

+1

Может быть, вы должны добавить еще один шаг, чтобы объединить два dataframes. –

ответ

2

В качестве альтернативы, с dplyr:

library(dplyr) 
dat <- dat %>% 
    group_by(PROFILE, NTHREADS) %>% 
    filter(TIME == min(TIME)) 
0

Наконец я сделал это с комментарием Ронак шаха. Ифф обоих dataframes доля имен столбцов & ценит (из-за агрегирования с MIN вместо среднего), самым простым решением является:

data_aggr <- merge(data_aggr, data) 
0

Рассмотрим ave, метод агрегировать через различные уровни факторов. Вы можете передать несколько группировок, как отдельные аргументы:

data <- read.table(text="PROFILE TIME NTHREADS PARAM1 PARAM2 PARAM3 
         prof1 3.01 1  4  10  1 
         prof2 2.90 2  4  10  1 
         prof1 3.02 1  4  10  1 
         prof2 1.52 2  4  10  2 
         prof1 1.60 1  4  10  2", header=TRUE) 

data$min_TIME <- ave(data$TIME, data$PROFILE, data$NTHREADS, FUN=min) 
data 

# PROFILE TIME NTHREADS PARAM1 PARAM2 PARAM3 min_TIME 
# 1 prof1 3.01  1  4  10  1  1.60 
# 2 prof2 2.90  2  4  10  1  1.52 
# 3 prof1 3.02  1  4  10  1  1.60 
# 4 prof2 1.52  2  4  10  2  1.52 
# 5 prof1 1.60  1  4  10  2  1.60