仅提取特定年份的行,并计算最常见的值

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 个病毒。

获得这些列后,按计数列(从大到小)排序,然后通过数据消除重复项,删除重复项。取消选中除病毒计数列之外的所有列,您应该拥有所需的内容。如果您只需要特定年份的数据,请在删除重复项之前按其中一个年份列进行过滤。