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

时间:2019-02-01 15:34:01

标签: excel excel-formula openrefine

我行一千,在Excel工作表,其中有一个地方得到了病人感染了病毒,当她被治好了日期。我也有在第三列,病毒ID,它就像一个外键,并指向另一个Excel工作表,其中的病毒名称存储,与virusID一起。日期格式如下:

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,没有运气。

2 个答案:

答案 0 :(得分:0)

对于OpenRefine,我将执行以下操作:

  • 导入第一Excel工作表作为OpenRefine项目(称为 “PROJECT_1”)。假设它具有列:
    • infected_date
    • 治愈日期
    • virus_id
  • 将第二个Excel工作表作为一个单独的OpenRefine项目(称为“ project_2”)导入。假设有列
    • virus_id
    • 病毒名称
  • 在创建的project_1中,从“ virus_id”列中使用“基于此列添加列选项”
    • 使用GREL:forEach(cell.cross("project_2","virus_id"),r,r.cells["virus_name"].value).join("|")
    • 调用新的列 “virus_name”
  • 在project_1中
    • 在virus_name列上创建文本构面
    • 使用GREL在infect_date列上创建“自定义文字构面”:(value.substring(0,4) == cells["healed_date"].value.substring(0,4)).toString()
  • 如果您在自定义文本构面中选择“ true”值,这会将项目过滤为仅感染和治愈年份相同的行
  • virus_name上的文本构面将为您提供每个病毒名出现在行集中的次数

如果您需要做更精确的“日期”相比较(如发现感染和愈合的日期是在彼此365天是),你可以在OpenRefine这些值转换为日期和使用GREL功能diff找到天的两个日期之间的数(或数月,数年,小时等)

答案 1 :(得分:0)

我通常会逐步解决这类问题。首先,确保在Excel中将A列和B列识别为日期。 C列是您的病毒ID。我将D列设置为一年感染的列,将公式= YEAR(A2)复制到该列的其余单元格中。 E列应为Year's 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将工作表与病毒ID和病毒名称匹配,例如:= LOOKUP(C2,Viruses!A $ 2:A $ 4,Viruses!B $ 2:B $ 4)假定A列是病毒ID,B列是病毒名称,并且它们都具有一行标题。在我的样本中,我只有3种病毒。

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