Выбор строки по минимальному значению и слияние - PullRequest
0 голосов
/ 23 апреля 2020

Это проблема выбора строки в R.

Я хочу получить только одну строку в каждом наборе данных на основе минимального значения переменной пятнадцать. Я попробовал два подхода ниже, ни один из них не возвращает желаемый результат.

Для списка 1> SPX [[1]] date.frame настроен так:

SPX1[[1]]
+----------------------------------+---------+------------------------+----------------+
|                                  | stkPx   |          expirDate     |    fifteen     |
+----------------------------------+---------+------------------------+----------------+
| 1                                | 1461.62 | 2013-01-19             |          2     |
| 2                                | 1461.25 | 2013-01-25             |          8     |
| 3                                | 1461.35 | 2013-02-01             |          3     |
| .                                |  .      |  .                     |          .     |
| .                                |  .      |  .                     |          .     |
+----------------------------------+---------+------------------------+----------------+

Первый подход - агрегирование и объединение. Поскольку это должно быть сделано для списка, код в al oop:

df.agg<- list() # creates a list
for (l in 1:length(SPX1)){ 
  df.agg[[l]]<- SPX1[[l]] %>%
aggregate(fifteen ~ ticker, data=SPX1[[l]], min) #Finding minimum value of fifteen for ticker
df.minSPX1 <- merge(df.agg[[l]], SPX1[[l]]) #Merge dataset so we only get row with min fifteen value
}

Я получаю:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'SPX1' of mode 'function' was not found

Другой подход, однако он просто меняет все значения первый столбец к одному, не удаляя строки при объединении:

TESTER<- which.min(SPX1[[1]]$fifteen) # Finds which row has minimum value of fifteen
df.minSPX1 <- merge(TESTER, SPX1[[1]],by.x=by) #Try to merge so I only get the row with min. fifteen

Я пытался читать другие ответы на SO, но, возможно, из-за того, как списки настроены, это не будет работать?

Надеюсь, вы скажете мне, где я ошибаюсь.

1 Ответ

1 голос
/ 23 апреля 2020

Попробуйте это

df<- lapply(SPX, function(x) x[x$fifteen==min(x$fifteen),])    
df<- as.data.frame(df)

Редактировать: Как предполагает @ Gregor-Thomas, это будет работать, когда есть в ie.

df<- lapply(SPX, function(x) x[which.min(x$fifteen), ])
df<- as.data.frame(df)
...