Excel - максимум между 2 сериями - PullRequest
0 голосов
/ 09 ноября 2018

enter image description here

У меня есть 2 серии данных. Для простоты предположим, что данные выглядят так, как показано ниже:

набор 1:

1   3
2   3.5
3   4
4   4.5
5   5
6   5.5
7   6
8   6.5
9   7
10  7.5

набор 2:

1.5   2
2.8   4.5
3.5   8
4.5   6
5.5   4.8
6.5   4
7.5   6.5
8.5   9
9.5   3
10.5  4

После составления схемы этих 2 наборов я хочу получить линию с более высокими данными. Я хочу черную линию, на прилагаемой картинке. Как мне это получить? Мои фактические данные содержат тысячи точек данных, поэтому сделать это вручную невозможно.

Добавлено позже: я забыл упомянуть еще одну вещь: в моем фактическом наборе данных 1 содержится около 500 значений x, y, а в другом наборе около 50 значений. Хотя конечные точки имеют одинаковые / похожие значения х. Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Введение

Несколько предположений / комментариев / подводных камней / ограничений относительно моего решения:

  • Набор 1 и Набор 2 находятся в столбцах от A до D.
  • Объединенный набор данных объединит значения x обоих Наборов и будет иметь дополнительные точки данных, где линии пересекаются.
  • Он включает несколько вспомогательных столбцов, в частности, чтобы позволить вам скопировать / вставить это в несколько листов с данными.
  • Я не пытался слишком много конденсировать, чтобы улучшить читаемость, и, возможно, некоторые вспомогательные столбцы можно было бы объединить.
  • Он был протестирован с набором данных из вопроса, но трудно гарантировать все "граничные" условия, например, идентичные точки данных между наборами 1 и 2, нулевое перекрытие между двумя наборами данных, пустые наборы данных и т. д. (некоторые из них я проверял, см. мои комментарии в конце).
  • Набор 1 и Набор 2 должны быть отсортированы (по значениям x). Если это не так, потребуется несколько дополнительных вспомогательных столбцов для динамической сортировки данных.

Чтобы лучше понять решение, описанное ниже, см. Приведенный ниже график, основанный на наборе данных в вопросе (хотя я добавил одну точку данных [2.5; 3.75], чтобы избежать идеального совпадения точек данных из набора 1 и набора 2). переменный):

enter image description here

Общая схема решения / методология

  • Объединить оба набора данных в один (отсортированный) столбец;
  • Для всех значений x определите наибольшее значение y между значением y в наборе и вычисленным значением y на отрезке линии из соседних значений в другом наборе (выглядит просто, в частности с приведен пример набора данных, но это довольно сложно сделать, когда наборы данных не имеют чередующихся значений x);
  • Найдите точки (значения x & y), где линии графика пересекаются (пересекаются), назовем это Set 3
  • Объединить и отсортировать (по значениям x) три набора данных в два столбца (для значений x & y).

Детали и формулы

Для формул я предполагаю, что строка 1 содержит заголовки, а данные начинаются со строки 2. Все формулы должны быть введены в строке 2, за исключением нескольких, где я упоминаю, чтобы поместить их в строку 3 (потому что им нужны данные из предыдущего ряда). Результат находится в столбцах E (значения x) и F (значения y), а G до AG являются вспомогательными столбцами).

  • Столбец E: =INDEX(AH$2:AH$30;MATCH(ROWS(AH$2:AH2);$AJ$2:$AJ$30;0)) Это фактический результат. Получает все значения x в AH и сортирует их по столбцу индекса AJ; на самом деле это должен быть последний столбец в логическом потоке, но для целей представления лучше иметь это рядом с наборами входных данных;
  • F: =INDEX(AF$2:AF$30;MATCH(ROWS(AF$2:AF2);$AG$2:$AG$30;0)) То же самое для значений y;
  • G: =IF(ISNA(H2);NA();COUNTIF($H$2:$H$30;"<="&H2)) Создает индекс для сортировки комбинированных значений x обоих наборов данных. Вы также можете динамически сортировать без такого вспомогательного столбца, но тогда вам нужны VLOOKUP или INDEX/MATCH, а с длинными десятичными числами у меня есть некоторые неудачные опыты с ними;
  • H: =IF(ROW()-1<=COUNT($A$2:$A$30);A2;IF((ROW()-1)<=(COUNT($A$2:$A$30)+COUNT($C$2:$C$30));INDEX($C$2:$C$30;ROW()-COUNT($A$2:$A$30)-1;1);NA())) Объединяет значения x обоих наборов данных, то есть в столбцах A и C;
  • I: =IF(ROW()-1<=COUNT($B$2:$B$30);B2;IF((ROW()-1)<=(COUNT($B$2:$B$30)+COUNT($D$2:$D$30));INDEX($D$2:$D$30;ROW()-COUNT($B$2:$B$30)-1;1);NA())) То же самое для значений y;
  • J: =IF(ROW()-1<=COUNT($A$2:$A$30);"S1";IF((ROW()-1)<=(COUNT($A$2:$A$30)+COUNT($C$2:$C$30));"S2";NA())) Назначить «S1» или «S2» каждой точке данных в качестве указания, из какого набора данных они поступают;
  • K: =IF(J2=J3;INTERCEPT(I2:I3;H2:H3);NA()) Определяет пересечение отрезка, начинающегося в этой точке данных;
  • L: =IF(J2=J3;SLOPE(I2:I3;H2:H3);NA()) То же для склона;
  • M: =INDEX(H$2:H$30;MATCH(ROWS(H$2:H2);$G$2:$G$30;0)) Сортировка всех значений x;
  • N: =INDEX(I$2:I$30;MATCH(ROWS(I$2:I2);$G$2:$G$30;0)) То же самое для значений y
  • O: =INDEX(J$2:J$30;MATCH(ROWS(J$2:J2);$G$2:$G$30;0)) То же самое для соответствующего значения "S1 / S2", чтобы указать, из какого набора данных они поступают;
  • P: =INDEX(K$2:K$30;MATCH(ROWS(K$2:K2);$G$2:$G$30;0)) То же самое для перехвата;
  • Q: =INDEX(L$2:L$30;MATCH(ROWS(L$2:L2);$G$2:$G$30;0)) То же самое для склона;
  • R: =IF(O2="S1";"S2";"S1") Инверсия между S1 и S2.
  • S: {=IFERROR(INDEX($O$2:$Q2;MAX(IF($O$2:$O2=$R3;ROW($O$2:$O2)-ROW(INDEX($O$2:$O2;1;1))+1));2);NA())} Формула массива для помещения в ячейку S3 (следовательно, ctrl + shift + enter), которая будет искать перехват предыдущей точки данных other набор данных.
  • T: {=IFERROR(INDEX($O$2:$Q2;MAX(IF($O$2:$O2=$R3;ROW($O$2:$O2)-ROW(INDEX($O$2:$O2;1;1))+1));3);NA())} То же самое для склона;
  • U: =IF(OR(ISNA(N2);NOT(ISNUMBER(S2)));NA();M2*T2+S2) Вычисляет значение y на отрезке линии другого набора данных;
  • V: =MAX(IFNA(U2;N2);N2) Максимальное значение между исходным значением y и вычисленным значением y в соответствующем сегменте линии другого набора данных;
  • W: =(V2=N2) Проверяет, является ли значение y исходным набором данных или нет;
  • X: =IF(O2="S1";IF(W2;"S1";"S2");IF(W2;"S2";"S1")) Определяет, в каком наборе данных (строке) находится y-значение (S1 или S2);
  • Y: =IFERROR(AND((X2<>X3);COUNTIF(X3:$X$30;X2)>0);FALSE) Определяет, когда наборы данных пересекаются (т.е. пересекаются линии на графике);
  • Z: =IF(Y2;(S2-P2)/(Q2-T2);NA()) Вычисляет x-значение пересечения;
  • AA: =IF(Y2;Z2*Q2+P2;NA()) Вычисляет значение y пересечения;
  • AB: =COUNTIF($Z$2:$Z$30;"<="&Z2) Индексировать для сортировки вновь рассчитанных точек пересечения (я сортирую их, потому что тогда объединение с другими наборами данных является простым, с повторным использованием формулы столбца H;
  • AC: =INDEX(Z$2:Z$30;MATCH(ROWS(Z$2:Z2);$AB$2:$AB$30;0)) Сортированные значения x точек пересечения;
  • AD: =INDEX(AA$2:AA$30;MATCH(ROWS(AA$2:AA2);$AB$2:$AB$30;0)) То же самое для значений y;
  • AE: =IF(ROW()-1<=COUNT(M$2:M$30);M2;IF((ROW()-1)<=(COUNT(M$2:M$30)+COUNT(AC$2:AC$30));INDEX(AC$2:AC$30;ROW()-COUNT(M$2:M$30)-1;1);NA())) Объединить значения x набора 1, набора 2 и точек пересечения;
  • AF: =IF(ROW()-1<=COUNT(V$2:V$30);V2;IF((ROW()-1)<=(COUNT(V$2:V$30)+COUNT(AD$2:AD$30));INDEX(AD$2:AD$30;ROW()-COUNT(V$2:V$30)-1;1);NA())) То же самое для значений y;
  • AG: =IF(ISNA(AE2);NA();COUNTIF($AE$2:$AE$30;"<="&AE2)) Создать индекс для сортировки результирующего набора данных (и он используется для вычисления окончательных результатов в столбцах E & F;

Все формулы идут до 30-й строки, но это, конечно, нужно изменить на основе фактических наборов данных. Идея состоит в том, чтобы добавить эти формулы в один лист, и затем столбцы E> AG можно скопировать во все другие листы. Очевидно, значений #NA довольно много, но это специально, и это не ошибки или ошибки. По запросу я могу предоставить доступ к самой электронной таблице, поэтому вам не нужно повторно вводить все формулы.

Некоторые дополнительные комментарии

  • Вы должны изменить некоторые формулы (индексы сортировки), если есть идентичные значения x, либо в наборе 1 (который я здесь не буду освещать, так как кажется, что это маловероятно, либо ошибки ввода данных), либо между набором 1 и набором 2. В этом случае динамическая сортировка не работает. Обходной путь - создать «синтетический» столбец сортировки, например, с =TEXT(J2;"0000.00000000000")&L2. Это форматирует все числа так же, как текст, и добавляет S1 или S2. Так что это должно дать уникальные значения сортировки, которые будут сортироваться так же, как и соответствующие числа.
  • Пустые наборы данных или наборы данных только с одним значением также обрабатываются некорректно (формулы перехвата и поиск значений для «предыдущей» точки данных в этих случаях не имеют смысла).
0 голосов
/ 09 ноября 2018

Учитывая вашу информацию о графике и таблицах, я бы сделал что-то вроде этого:

Новая серия будет основана на двух формулах:

В столбце H у меня есть формула для максимального значения (между вашими двумя сериями):

=MAX(B2,E2)

В столбце G у меня есть формула, основанная на значении Max (формула выше), какое значение X мне следует использовать (значение X из серии 1 или 2).

=IF(H2=B2,A2,D2)

enter image description here

Тогда я могу построить свой график:

  • Серия 1, колонка B

  • Серия 2, колонка E

  • Серия 3, колонка H.

  • Во всех сериях используются значения X столбца G.

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