#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)))