R: Найдите максимальную точку в наборе данных

#r #data-visualization #data-manipulation

Вопрос:

Я использую язык программирования R. Предположим, у меня есть следующие данные:

 set.seed(123)  a = rnorm(100000,10,10) b = rnorm(100000,10,10)  my_data = data.frame(a,b)  plot(my_data$a, my_data$b)  

введите описание изображения здесь

Когда вы смотрите на эти данные:

 head(my_data)  a b 1 4.395244 12.649934 2 7.698225 28.307475 3 25.587083 9.406217 4 10.705084 9.467906 5 11.292877 14.379042 6 27.150650 23.374490  

Мой вопрос: Есть ли способ узнать, содержит ли этот набор данных точку, такую, что

  • все значения «a» меньше, чем a-координата этой точки, И
  • все значения «b» меньше, чем b-координата этой точки

Есть ли такой способ узнать, содержит ли этот набор данных «глобальную максимальную точку»?

введите описание изображения здесь

Например, как красная точка выше. Я знаю, что в большинстве случаев вряд ли удастся найти такую точку, поскольку точка с наибольшей a-координатой не обязательно будет иметь наибольшую b-координату и наоборот:

 #row with max value of "a" which(my_data == max(my_data$a), arr.ind=TRUE)   row col [1,] 23102 1  #row with max value of "b"  which(my_data == max(my_data$b), arr.ind=TRUE)  row col [1,] 2071 2  #display row with max value of "a" gt; my_data[23102,]  a b 23102 53.22815 4.500006  #display row with max value of "b" gt; my_data[2071,]  a b 2071 15.85992 52.0609  

Как мы видим, строка с максимальным значением «a» не содержит максимального значения «b».

Спасибо!

Примечание: В реальном мире часто невозможно найти «глобальные максимальные точки», так как в больших данных точки «перекрываются» (разные строки содержат максимумы разных столбцов). В контексте задач оптимизации несколько точек часто могут соответствовать этим критериям, и все они считаются подходящими — эти точки называются «не доминирующими» и, как говорят, расположены на «Границе Парето» (зеленая линия).:

введите описание изображения здесь

Ответ №1:

Вот один из способов. Поскольку номер строки равен 0, такой точки нет, когда и a, и b максимальны.

 library(dplyr)  my_data %gt;%  filter(if_all(.fns = ~.x == max(.x))) # [1] a b # lt;0 rowsgt; (or 0-length row.names)  

Комментарии:

1. @ www: спасибо за ваш ответ! Я попытался привести пример, где я целенаправленно добавляю максимальное количество очков, и это сработало!

2. библиотека(dplyr) a = rnorm(100000,10,10) b = rnorm(100000,10,10) my_data = данные.кадр(a,b) a = rnorm(1,100,1) b = rnorm(1,100,1) my_data_1 = данные.кадр(a,b) final_data = rbind(my_data, my_data_1) final_data %gt;% фильтр(if_all(.fns = ~.x == макс(.x)))