编码多个“记录”时如何转置列?

时间:2019-12-05 03:25:44

标签: 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,bar1..3)
  3. 将您的CONCAT列转换为一列,没有前缀,忽略空格,填充其他列
  4. 现在FOO_CONCAT和BAR_CONCAT都在同一列中
  5. 将该列拆分为几列...(使用您在步骤1中使用的分隔符)
  6. 重命名列
  7. 去除前缀(为清楚起见,我使用foo1:4,bar2:8等)
  8. 转换为数字(编辑单元格->通用转换-> toNumber)
  9. 现在您可以进行转置,构面等了

1 个答案:

答案 0 :(得分:0)

我认为您所描述的解决方案本质上是相同的,但可能有一些捷径可以避免所有步骤。

给出您要发布的示例数据:

  1. 在“ Id”列上,选择“编辑列”->“基于此列添加列” 从菜单中
  2. 使新列名称为“ foobar”
  3. 使用GREL forEach(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("|")

使用“切片”功能选择某些列,而不是使用列名的某些方面来选择它们。