提问人:James Davies 提问时间:11/28/2022 最后编辑:James Davies 更新时间:11/29/2022 访问量:126
在 excel 中对块中包含的数据进行排序
Sort data contained in blocks in excel
问:
我在 excel 中有大量参考数据,我正在尝试以各种方式操作这些数据。我在结构和分类为更易于管理的格式的方式方面遇到了一些问题。
问题1: 我有三列。A 列首先包含日期,然后是高或低的指示符。B 列包含时间,C 列包含高度。
我想按 B 列对数据进行排序(很简单),但我希望保留 A 列中的日期标题。这几乎就像我有 365 个表,每个表都有 3 到 5 条数据 - 我只希望对每个日期内的 3 到 5 条数据进行排序。
这是我目前所拥有的:
我先获取数据并以其他方式操作它没有问题 - 这最终是我能够获取一批数据(5 个不同的参考点,每个参考点为 365 天)并开发一个流程来清理它并按时间顺序显示它,以及能够将其转换为问题 2 的可用格式(我需要通过一旦我有了排序数据)。
这就是我想要的样子(我手动浏览了这些块中的每一个并对其进行了排序):
答:
可以在Excel中执行此操作,在单元格中如下所示:E2
=LET(rng, A1:C11, set, FILTER(rng, (INDEX(rng,,1) <>"")),
dates, SCAN("", INDEX(set,,1), LAMBDA(acc, item, IF(ISNUMBER(item), item, acc))),
in, FILTER(HSTACK(dates, set), INDEX(set,,2)<>""), inDates, INDEX(in,,1),
out, REDUCE("", UNIQUE(inDates), LAMBDA(acc, date,
LET(sorted, VSTACK(date, DROP(SORT(FILTER(in, inDates = date),3),,1), {"","",""}),
VSTACK(acc, sorted)
))), IFERROR(DROP(DROP(out,1),-1),"")
)
您可以避免清理过程,但删除最后一行除外,如下所示:
=LET(rng, A1:C11, set, FILTER(rng, (INDEX(rng,,1) <>"")),
dates, SCAN("", INDEX(set,,1), LAMBDA(acc, item, IF(ISNUMBER(item), item, acc))),
in, FILTER(HSTACK(dates, set), INDEX(set,,2)<>""), inDates, INDEX(in,,1),
out, REDUCE("", UNIQUE(inDates), LAMBDA(acc, date,
LET(sorted, VSTACK(HSTACK(date,"",""), DROP(SORT(FILTER(in, inDates = date),3),,1),
{"","",""}), IF(MAX(LEN(acc))=0, sorted, VSTACK(acc, sorted))
))), DROP(out, -1)
)
解释
基本上是执行手动步骤,但使用 excel 函数。名称 与输入数据 () 相同,但我们删除了空行。名称 是与 相同大小的列,重复所有日期。函数中标识新日期的条件是因为日期以整数形式存储在 Excel 中。该名称包含我们想要的格式的数据,用于按日期进行排序和筛选,删除日期标题并添加 .set
rng
dates
rng
SCAN
ISNUMBER
in
dates
现在我们使用模式(检查问题的答案:如何在 Excel 中将表格从垂直转换为水平,但具有不同的长度,由 David Leal 提供)为给定的唯一值附加每个排序数据。我们添加 作为第一行,然后对数据进行排序,最后添加一个空行来分隔每组数据。最后,我们进行清理以删除值以及第一个和最后一个空行。DROP/REDUCE/VSTACK
date
date
IFERROR/DROP
#N/A
评论
=LET(rng, A1:C11, set, FILTER(rng, (INDEX(rng,,1) <>"")), dates, SCAN("", INDEX(set,,1), LAMBDA(acc,item, IF(ISNUMBER(item), item, acc))), in, FILTER(HSTACK(dates, set), INDEX(set,,2)<>""), inDates, INDEX(in,,1), out, REDUCE("", UNIQUE(inDates), LAMBDA(acc,date, LET(sorted, DROP(SORT(FILTER(in, inDates = date),3),,1), addDateInfo, HSTACK(INDEX(sorted,,1), INDEX(sorted,,2)+ date, INDEX(sorted,,3)), blockInfo, VSTACK(HSTACK(date,"",""), addDateInfo, {"","",""}), IF(MAX(LEN(acc))=0, blockInfo, VSTACK(acc, blockInfo)) ))), DROP(out, -1) )
评论