【问题标题】:Excel: Find unique values from a row and create a column for it?Excel:从一行中查找唯一值并为其创建一列?
【发布时间】:2017-10-27 02:33:52
【问题描述】:

我不确定我们是否可以在 excel 中执行此操作。我有一个大约 1000 行的电子表格,如下所示:

Col 1      Col 2  
Fruit1      (Apple, Banana, Grape, Orange)  
Fruit2      (Apple, Orange)  
Fruit3     (Grape, Banana, Orange)  
Fruit4     (Pineapple)  

我想做什么?这个:

Col1        Apple Banana Grape Orange Pineapple  
Fruit1      yes   yes    yes   yes    no  
Fruit2      yes   no     no    yes    no  
Fruit3      no    yes    yes   yes    no  
Fruit4      no    no     no    no     yes  

问题:第 2 列有水果名称。首先为每一行查找唯一的水果名称,然后根据找到的唯一值创建一列。此外,如果该值重复,请为再次找到该值的相应行添加是/否。所以我需要将值拆分为列,并为每次重复值设置一个计数器。我必须从电子表格 A 创建电子表格 B。在示例中,Apple、Banana、Grape、Orange 和 Pineapple 成为唯一的列名,如果找到值,我对每一行检查是或否。

我需要这方面的帮助,已经 2 天了,但我想不出一个 Excel 解决方案。 Python 解决方案很简单,但我不能使用编程。

非常抱歉,我的格式游戏在 Stackoverflow 上不强。

谢谢! :)

【问题讨论】:

  • 你想为它写一个c#程序吗?
  • 我会回答这个问题,但我认为我无法击败 Scott 的答案...将使用一些关于搜索/查找公式的内容
  • 您是在寻找流程还是在寻找公式?例如,您可以使用 text-to-columns 功能将第二列拆分为多列,每列中有一个单词吗?
  • 最难的部分是生成唯一的单词列表...您使用的是什么版本的 excel?
  • @ForwardEd 我可能会想出一个数组公式来满足需要,但它会过于复杂且非常慢,因为它会挖掘 1000 行。老实说,不,我不能在 2013 年这样做,因为任何机会都会使用不可用的 TEXTJOIN()。您的手动方法可能是要走的路。

标签: excel unique rows


【解决方案1】:

我觉得有一种方法可以使用 TXTSPLIT 或 regex 之类的方法,但我只有 2013 年,显然你这样做了,所以这些将不是一个选项。

这只是我脑海中的一个思考过程。我首先将第二列复制到您计划放置表格的工作表中。然后,我将从该工作表开始,选择您的数据,然后在您的功能区中选择“文本到列”。

然后你应该在这个屏幕上结束

选择“分隔”单选按钮,然后按下一步

确保选择逗号作为分隔符,或者任何与分隔单词的内容相匹配的内容。如果您的数据(例如 Apple、Brains、Beaver Tails)中有空白,您可能需要选择“将连续分隔符视为一个”。确保您没有选择空格作为分隔符,以防您的分隔符之间有多字数据。

然后您的数据应该被分成多列,每个单词都在自己的单元格中。

然后我会选择每个单独的列,然后选择删除重复项按钮。我尝试一次处理多个列,但这样做时它并没有删除所有列中的重复项。

所以选择你的列

然后选择从功能区中删除重复项

我选择了继续选择,因为我只想一次处理一列。

我没有选中“我的数据有标题”并点击确定

瞧,我们在列中有一个唯一的列表

对所有列重复此操作。然后将您的列移动到一列并重复复制过程。您可以先完成此步骤,但处理移动可能需要更长的列。最后你应该得到一列独特的单词。

这里所有的列在列中是唯一的,但不是表。

所以列被堆叠成 1

在单个列上运行删除重复项后,将获得以下唯一列表。

现在您可以获取该数据并将其转置为您的列标题,并通过细微的调整使您的表格看起来像:

现在我们已经设置好了表格,我将在表格的 B2 中使用以下公式并向下和向右复制。注意 $ 以锁定行或列引用。

=IF(ISNUMBER(FIND(B$1,$B12)),"yes","no")
'FIND is case sensitive

编辑

=IF(ISNUMBER(SEARCH(B$1,$B12)),"yes","no")
'SEARCH is NOT case sensitive

在此公式中,B$1 是标题行,$B12 是第二列的第一行数据。

根据 B12:b15 中列出的日期,结果如下所示

公式替代

将以下内容放在第三列中,根据需要向右和向下复制。

=TRIM(MID(SUBSTITUTE(","&$B2&REPT(",",6),",",REPT(" ",255)),COLUMNS($B2:B2)*255,255))

我个人会先将它一直复制到 z 列左右,然后再复制到 10K 行。

现在是让您的系统陷入瘫痪的部分。对于公式结束的每个单元格,这将是一个巨大的计算量。它将生成唯一列表。在从第二行开始的未使用列中使用以下内容。将范围 G12:J15 转换为匹配 B2:Z10000 或您最终使用的任何范围。将 $L$11:L11 更改为您希望出现第一个唯一名称的上方的空白区域。因此,如果您想从 AA2 开始您的列表,请将其更改为 $AA$1:AA1。

=INDIRECT(TEXT(MIN(IF(($G$12:$J$15<>"")*(COUNTIF($L$11:L11,$G$12:$J$15)=0),ROW($G$12:$J$15)*100+COLUMN($G$12:$J$15),7^8)),"R0C00"),)&""

这是一个 ARRAY 公式或 CSE。这意味着您在完成公式时需要使用 CONTROL+SHIFT+ENTER,而不仅仅是 ENTER。当您在公式栏中的公式周围看到 {} 时,您将知道您做对了。这些不能手动添加。仅根据需要将列表复制下来。当没有更多唯一条目时,它将生成空白条目,但它仍在执行大量计算。

假设您在 Sheet1 上完成了上述所有生成操作,您可以使用以下公式从那里生成标题行。在您想要第一个标题和版权的地方使用以下公式:

=INDEX(Sheet1!AA:AA,COLUMN(B1))

然后您可以生成您的是/否表,就像手动方法的最后一步中使用的公式一样。

【讨论】:

  • 谢谢,让我在原始文件上试试这个过程,看看会发生什么。我会回复你的。
  • 锁定...最终答案!
  • 一张图片值一千字……那至少是一个 14K 字的答案!
  • 有一个公式化的方法,但你的数据量可能真的很慢
  • 使用我的数据,我能够制作一个网格,但公式 =IF(ISNUMBER(SEARCH(B$1,$B12)),"yes","no") 显示错误的结果.我尝试了多次不同的方式。我非常感谢您在这里的帮助。这是梦幻般的!我无法将唯一值列转置为单独的列,所以我手动复制粘贴。另外,在搜索公式中,搜索字符串在另一个工作表中,所以我应该使用 VLOOKUP 吗?
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多