2015-04-16 3 views
0

Предположим, у меня есть фрейм данных, как показано ниже. Большинство предложений, которые я нашел в Stackoverflow, нацелены на получение максимального значения от одного столбца, а затем возврат индекса строки. Мне было интересно, есть ли способ вернуть индекс строки кадра данных, сканировав два или более столбцов для максимума.Как вернуть строку из кадра данных на основе максимального значения кадра данных в R?

Итак, из приведенного ниже примера, я хочу, чтобы получить строку:

11 building_footprint_sum 0.003 0.470 

который держит максимум кадра

+----+-------------------------+--------------------+-------------------+ 
| id |  plot_name  | rsquare_allotments | rsquare_block_dev | 
+----+-------------------------+--------------------+-------------------+ 
| 6 | building_footprint_max | 0.002    | 0.421    | 
| 7 | building_footprint_mean | 0.002    | 0.354    | 
| 8 | building_footprint_med | 0.002    | 0.350    | 
| 9 | building_footprint_min | 0.002    | 0.278    | 
| 10 | building_footprint_sd | 0.003    | 0.052    | 
| 11 | building_footprint_sum | 0.003    | 0.470    | 
+----+-------------------------+--------------------+-------------------+ 

данных Есть довольно простой способ для достижения этой цели ?

+0

Возможно ли, что максимальное число в каждом столбце будет в одной строке? Если нет, один из столбцов должен будет иметь приоритет, или вам потребуется какое-то правило принятия решений, например, использовать сумму двух столбцов. –

ответ

0

Попробуйте использовать pmax

?pmax  
pmax and pmin take one or more vectors (or matrices) as arguments and 
return a single vector giving the ‘parallel’ maxima (or minima) of the vectors. 

Я бы предложил сделать это в два этапа

# make a new column that compares column 3 and column 4 and returns the larger value 
> df$new <- pmax(df$rsquare_allotments, df$rsquare_block_dev) 

# look for the row, where the new variable has the largest value 
> df[(df$new == max(df$new)), ][3:4] 

Считают, что если максимальное значение встречается более чем один раз, ваш результат будет иметь более чем одну строку

+0

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

+0

ОК. Но каково максимальное значение data.frame с несколькими столбцами? – rmuc8

+0

Как и в приведенном выше примере, максимальное значение двух столбцов составляет 0,470 (строка 6, столбец 4). Таким образом, это значение должно быть найдено, и строка, где этот максимум возникает, должна быть возвращена, так что я могу сохранить возвращенную строку в новом df. –

2

Вы ищете индекс строки, в котором матрица достигает своего максимума. Вы можете сделать это с помощью which() с опцией arr.ind=TRUE:

> set.seed(1) 
> foo <- matrix(rnorm(6),3,2) 
> which(foo==max(foo),arr.ind=TRUE) 
    row col 
[1,] 1 2 

Таким образом, в этом случае вам нужно будет строка 1.

Если идти по этому пути, (и вы можете отказаться от col выход.) будьте осторожны с арифметикой с плавающей запятой и == (см. часто задаваемые вопросы 7.31). Лучше сделать это:

> which(foo>max(foo)-0.01,arr.ind=TRUE) 
    row col 
[1,] 1 2 

где вы используете соответствующее небольшое значение вместо 0,01.

+0

Благодарим вас за советы, но похоже, что проблема связана с файлами данных, которые содержат не только числовые значения. Когда я пытаюсь использовать свой код для моего вышеупомянутого фрейма данных, он говорит: «Определено только для фрейма данных с числовыми переменными» –

+0

(1) Не могли бы вы отредактировать сообщение, чтобы включить воспроизводимый пример, и указать, какой результат вы бы как видеть операцию 'max', если числовые и нечисловые данные смешаны? (И прокомментируйте здесь, чтобы я заметил ваше редактирование). (2) Я подозреваю, что вам нужно подмножество соответствующих столбцов вашего 'data.frame', например' as.matrix (your.data.frame [, 3: 4]) '- возможно, вы можете попробовать это и посмотреть, помогает ли это. –

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