仅提取特定年份的行,并计算最常见的值
extract only rows of a certain year, and count the most seen values
我有一千行,在 excel sheet 中,其中包含患者感染病毒的日期以及治愈的日期。我在第三列中还有病毒 ID,它就像一个外键,并指向另一个 excel sheet,其中存储了病毒名称以及病毒 ID。日期格式如下:
column A: patient infected date
2002-01-22 13:25:41
column B: patient healed date
2002-01-24 10:35:21
我尝试做的是说 100 种最常见的病毒,它们在同一年感染并治愈,并附上它们的标题。 (所以感染和治愈年份,必须都是2002年)
类似于(按出现次数排序,2002 年):
virus1 | name of virus1 | number of occurrences
virus2 | name of virus2 | number of occurrences
我应该使用哪个 excel 公式?或者如果有人可以指出我的 openrefine 解决方案,那就更好了。已尝试 INDEX、MATCH,但没有成功。
对于 OpenRefine,我将执行以下操作:
- 将第一个 Excel sheet 作为 OpenRefine 项目导入(称为 "project_1")。让我们假设这有列:
- infected_date
- healed_date
- virus_id
- 将第二个 Excel sheet 作为单独的 OpenRefine 项目导入(称为 "project_2")。让我们假设这有列
- virus_id
- virus_name
- 在 project_1 中创建,从 "virus_id" 列使用 'add column based on this column option'
- 使用 GREL:
forEach(cell.cross("project_2","virus_id"),r,r.cells["virus_name"].value).join("|")
- 调用新列"virus_name"
- 在project_1
- 在 virus_name 列上创建一个文本构面
- 使用 GREL 在 infect_date 列上创建一个 "Custom text facet":
(value.substring(0,4) == cells["healed_date"].value.substring(0,4)).toString()
- 如果您 select 自定义文本方面的 'true' 值,这会将项目过滤为仅感染和治愈年份相同的行
- virus_name 上的文本方面将为您提供每个病毒名称在行集中出现的次数
如果您需要进行更精确的 'date' 比较(例如查找相互之间 365 天内的感染日期和治愈日期),您可以将这些值转换为 OpenRefine 中的日期并使用 GREL 函数 diff
求两个日期之间的天数(或月、年、小时等)
我通常会分步解决这类问题。首先,确保 A 列和 B 列被识别为 Excel 中的日期。 C 列是您的病毒 ID。我将公式 =YEAR(A2) 复制到该列的其余单元格中,使 D 列成为一年感染列。 E 列应为 Year Healed,并将 =YEAR(B2) 向下复制到该列的其余单元格。 F 列将使用 =IF(E2=D2,1,0) 指示年份是否匹配。
最后,主要工作是使用 countifs 函数完成的。 G 列应包含公式为 =COUNTIFS(C$2:C$541,C2,F$2:F$541,1) 的单元格。在我的测试示例中,我只有第 541 行的数据。无论你有多少行,你都会有。将 541 替换为您的最后一行编号。要获取病毒名称,您将使用病毒 ID 将 sheet 与病毒 ID 和病毒名称相匹配,公式如下:=LOOKUP(C2,Viruses!A$2:A$4,Viruses! B$2:B$4) 这假设 A 列是病毒 ID,B 列是病毒名称,它们都有一行 header。在我的样本中,我只有 3 个病毒。
获得这些列后,按计数列(从大到小)排序,然后通过数据消除重复项,删除重复项。取消选中除病毒计数列之外的所有列,您应该拥有所需的内容。如果您只需要特定年份的数据,请在删除重复项之前按其中一个年份列进行过滤。
我有一千行,在 excel sheet 中,其中包含患者感染病毒的日期以及治愈的日期。我在第三列中还有病毒 ID,它就像一个外键,并指向另一个 excel sheet,其中存储了病毒名称以及病毒 ID。日期格式如下:
column A: patient infected date
2002-01-22 13:25:41
column B: patient healed date
2002-01-24 10:35:21
我尝试做的是说 100 种最常见的病毒,它们在同一年感染并治愈,并附上它们的标题。 (所以感染和治愈年份,必须都是2002年)
类似于(按出现次数排序,2002 年):
virus1 | name of virus1 | number of occurrences
virus2 | name of virus2 | number of occurrences
我应该使用哪个 excel 公式?或者如果有人可以指出我的 openrefine 解决方案,那就更好了。已尝试 INDEX、MATCH,但没有成功。
对于 OpenRefine,我将执行以下操作:
- 将第一个 Excel sheet 作为 OpenRefine 项目导入(称为 "project_1")。让我们假设这有列:
- infected_date
- healed_date
- virus_id
- 将第二个 Excel sheet 作为单独的 OpenRefine 项目导入(称为 "project_2")。让我们假设这有列
- virus_id
- virus_name
- 在 project_1 中创建,从 "virus_id" 列使用 'add column based on this column option'
- 使用 GREL:
forEach(cell.cross("project_2","virus_id"),r,r.cells["virus_name"].value).join("|")
- 调用新列"virus_name"
- 使用 GREL:
- 在project_1
- 在 virus_name 列上创建一个文本构面
- 使用 GREL 在 infect_date 列上创建一个 "Custom text facet":
(value.substring(0,4) == cells["healed_date"].value.substring(0,4)).toString()
- 如果您 select 自定义文本方面的 'true' 值,这会将项目过滤为仅感染和治愈年份相同的行
- virus_name 上的文本方面将为您提供每个病毒名称在行集中出现的次数
如果您需要进行更精确的 'date' 比较(例如查找相互之间 365 天内的感染日期和治愈日期),您可以将这些值转换为 OpenRefine 中的日期并使用 GREL 函数 diff
求两个日期之间的天数(或月、年、小时等)
我通常会分步解决这类问题。首先,确保 A 列和 B 列被识别为 Excel 中的日期。 C 列是您的病毒 ID。我将公式 =YEAR(A2) 复制到该列的其余单元格中,使 D 列成为一年感染列。 E 列应为 Year Healed,并将 =YEAR(B2) 向下复制到该列的其余单元格。 F 列将使用 =IF(E2=D2,1,0) 指示年份是否匹配。
最后,主要工作是使用 countifs 函数完成的。 G 列应包含公式为 =COUNTIFS(C$2:C$541,C2,F$2:F$541,1) 的单元格。在我的测试示例中,我只有第 541 行的数据。无论你有多少行,你都会有。将 541 替换为您的最后一行编号。要获取病毒名称,您将使用病毒 ID 将 sheet 与病毒 ID 和病毒名称相匹配,公式如下:=LOOKUP(C2,Viruses!A$2:A$4,Viruses! B$2:B$4) 这假设 A 列是病毒 ID,B 列是病毒名称,它们都有一行 header。在我的样本中,我只有 3 个病毒。
获得这些列后,按计数列(从大到小)排序,然后通过数据消除重复项,删除重复项。取消选中除病毒计数列之外的所有列,您应该拥有所需的内容。如果您只需要特定年份的数据,请在删除重复项之前按其中一个年份列进行过滤。