编码多个 "records" 时如何转置列?
How to transpose columns when they encode multiple "records"?
我有一个已导入 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 列,我目前被卡住了。
我找到了解决办法。步骤是:
- 将每组列合并为一个列(FOO_CONCAT、BAR_CONCAT)
- 删除现在不需要的列(foo1..3,bar1..3)
- 将您的 CONCAT 列转置为单列,无前缀,忽略空格,填充其他列
- 现在FOO_CONCAT和BAR_CONCAT都在同一列
- 将该列分成几列...(使用您在步骤 1 中使用的分隔符)
- 重命名列
- 去除前缀(为了清楚起见,我有 foo1:4、bar2:8 等)
- 转换为数字(编辑单元格 -> 通用转换 -> toNumber)
- 现在您已准备好转置、刻面等
我认为这与您描述的解决方案基本相同,但可能有一些快捷方式可以避免所有步骤。
鉴于您的示例数据 post 我会:
- 在"Id"列select编辑列->添加基于该列的列
来自菜单
- 创建新的列名称"foobar"
- 使用 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("|")
- 一旦存在新的 "foobar" 列,在此列上使用菜单选项编辑单元格->使用“~”字符拆分多值单元格(如上面的 GREL 中所用)
- 还在 "foobar" 列上使用菜单选项“编辑列”->“拆分为多个列”,使用“|”上面 GREL 中的字符
- 最后在 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' 函数来 select 某些列,而不是使用列名称的某些方面来 select 它们。
我有一个已导入 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 列,我目前被卡住了。
我找到了解决办法。步骤是:
- 将每组列合并为一个列(FOO_CONCAT、BAR_CONCAT)
- 删除现在不需要的列(foo1..3,bar1..3)
- 将您的 CONCAT 列转置为单列,无前缀,忽略空格,填充其他列
- 现在FOO_CONCAT和BAR_CONCAT都在同一列
- 将该列分成几列...(使用您在步骤 1 中使用的分隔符)
- 重命名列
- 去除前缀(为了清楚起见,我有 foo1:4、bar2:8 等)
- 转换为数字(编辑单元格 -> 通用转换 -> toNumber)
- 现在您已准备好转置、刻面等
我认为这与您描述的解决方案基本相同,但可能有一些快捷方式可以避免所有步骤。
鉴于您的示例数据 post 我会:
- 在"Id"列select编辑列->添加基于该列的列 来自菜单
- 创建新的列名称"foobar"
- 使用 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("|")
- 一旦存在新的 "foobar" 列,在此列上使用菜单选项编辑单元格->使用“~”字符拆分多值单元格(如上面的 GREL 中所用)
- 还在 "foobar" 列上使用菜单选项“编辑列”->“拆分为多个列”,使用“|”上面 GREL 中的字符
- 最后在 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' 函数来 select 某些列,而不是使用列名称的某些方面来 select 它们。