如何在列编码多个"records"时转置列?

  • 本文关键字:records 转置 编码 openrefine
  • 更新时间 :
  • 英文 :


我有一个电子表格,我已经导入到OpenRefine中。创建者在列中对信息(记录(组进行编码。我需要将这些列组中的每一组以及所有相关列一起放入其自己的行中。

使用一个简化的示例,我将如何从中:

id  foo1  foo2  foo3  bar1  bar2  bar3
1    4     6     a     7     9     b
2    5     5     a     8     8     b
3    6     4     a     9     7     b

对此:

id  foobar1  foobar2  foobar3  
1    4         6        a     
1    7         9        b   
2    5         5        a     
2    8         8        b     
3    6         4        a     
3    9         7        b     

我一直在尝试使用中间列来思考前进的方法,但是有 6 组 5 列,我目前卡住了。


我找到了一个解决方案。步骤如下:

  1. 将每组列连接为单个列(FOO_CONCAT、BAR_CONCAT(
  2. 删除现在不需要的列 (foo1..3、酒吧1..3(
  3. 将您的 CONCAT 列转置为单个列,无前缀,忽略空白,填充其他列
  4. 现在FOO_CONCATs和BAR_CONCATs都在同一列中
  5. 将该列拆分为几列...(使用您在步骤 1 中使用的分隔符(
  6. 重命名列
  7. 去掉前缀(为了清楚起见,我有 foo1:4、bar2:8 等(
  8. 转换为数字(编辑单元格 -> 常见转换 -> 到数字(
  9. 现在您已准备好转置,分面等

我认为这与您描述的解决方案基本相同,但可能有一些快捷方式可以避免所有步骤。

鉴于您发布的示例数据,我将:

  1. 在"Id"列上,选择编辑列>基于此列添加列 从菜单
  2. 使新列名称为"foobar">
  3. 使用 GRELforEach(row.columnNames,cn,if(cn.startsWith("foo"),cells[cn].value,null)).join("|")+"~"+forEach(row.columnNames,cn,if(cn.startsWith("bar"),cells[cn].value,null)).join("|")
  4. 一旦新的"foobar"列存在,在此列上使用菜单选项编辑单元格 ->使用"~"字符拆分多值单元格(如上面的 GREL 中使用(
  5. 同样在"foobar"列使用菜单选项编辑列 ->拆分为几列,使用"|"字符,如上面的 GREL 所示
  6. 最后在ID列使用菜单编辑单元格->向下填充

这应该会产生您描述的输出 - 如果此时不需要原始列,则可以删除它们,或者(有时更快(使用自定义表格导出器导出具有重新配置数据的前 X 列,然后将该数据导入新项目。

您可以修改 GREL 以处理您拥有的确切列分组。在我的示例中,我使用列命名对值进行分组,但如果这不是您正在处理的数据的现实情况,则可以使用 GREL,如下所示:

forEach(row.columnNames.slice(1,4),cn,cells[cn].value).join("|")+"~"+forEach(row.columnNames.slice(4,8),cn,cells[cn].value).join("|")

它使用"slice"功能来选择某些列,而不是使用列名称的某些方面来选择它们。

最新更新