Excel-2系列之间的最大值

时间:2018-11-08 21:34:16

标签: excel-formula

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

在绘制了这两组数据后,我想获得数据较高的行。我要黑线,在所附的图片中。我怎么得到的?我的实际数据有成千上万个数据点,因此无法手动进行。

稍后添加:我忘记提及的另一件事,在我的实际数据中,一组有大约500 x,y值,另一组有大约50个值。尽管端点具有相同/相似的x值。 感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

鉴于您有关图表和表格的信息,我将执行以下操作:

新系列将基于两个公式:

在H列中,我有最大值的公式(在两个系列之间):

=MAX(B2,E2)

在G列中,我有一个基于最大值(上面的公式)的公式,我应该使用该X值(系列1或2的X值)。

=IF(H2=B2,A2,D2)

enter image description here

然后我可以绘制图形:

  • 系列1,B列

  • 系列2,E栏

  • 系列3,H列。

  • 所有系列均使用G列的X值。

答案 1 :(得分:1)

简介

关于我的解决方案的一些假设/评论/陷阱/约束:

  • 集合1和集合2在A到D列中。
  • 合并的数据集将合并两个集合的x值,并在线相交处具有其他数据点。
  • 它涉及几个帮助器列,特别是允许您在多个工作表中复制/粘贴数据。
  • 我并没有尝试过多地压缩以提高可读性,并且可能可以合并一些辅助列。
  • 已使用问题中的数据集进行了测试,但很难保证所有“边界”条件,例如数据集1和数据集2之间的数据点相同,两个数据集之间的零重叠,空数据集等。(我确实测试了其中一些数据,请参见结尾处的评论)。
  • 必须对集合1和集合2进行排序(基于x值)。如果不是这种情况,则需要一些额外的帮助器列来对数据进行动态排序。

为了更好地理解以下描述的解决方案,请根据问题中的数据集参阅结果图(尽管我添加了一个数据点[2.5; 3.75]以避免完全拥有Set 1和Set 2的数据点交替):

enter image description here

一般解决方案概述/方法

  • 将两个数据集合并在一个(排序的)列中;
  • 对于所有x值,请确定Set中y值与根据另一个Set中的相邻值计算的线段上y值之间的最高y值(看起来很简单,尤其是对于给定示例数据集,但是当数据集没有交替的x值时,这样做非常棘手);
  • 找到图的线相交(相交)的点(x和y值),我们称其为Set 3
  • 在两个列中(针对x和y值)组合和排序(基于x值)这三个数据集。

详细信息和公式

对于公式,我假设第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))这是实际结果。获取AH中的所有x值,并根据索引列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值进行排序。您也可以在没有此类帮助程序列的情况下进行动态排序,但是随后您需要使用VLOOKUPINDEX/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()))组合集合1,集合2和交点的x值;
  • 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值相同,则必须修改某些公式(排序索引),要么在Set 1(我将不在这里讨论,因为这似乎不太可能,或者是数据输入错误),或者在Set 1和Set 2之间。动态排序在这种情况下不起作用。一种解决方法是创建一个“综合”排序列,例如与=TEXT(J2;"0000.00000000000")&L2。这将以与文本相同的方式设置所有数字的格式,并附加S1或S2。因此,这应该给出唯一的排序值,该排序值的排序方式与相应的数字相同。
  • 空数据集或仅包含1个值的数据集也不会得到正确处理(在这些情况下,截距公式和“上一个”数据点的查找值没有意义)。