【问题标题】:Perl: Merging columns with the same names and keeping row namesPerl:合并具有相同名称的列并保留行名
【发布时间】:2014-02-03 04:50:43
【问题描述】:

我基本上想要做的是使用这样的表格,其中第一行包含列名:

A    B    B    B
a    9    8    9
a    6    5    3
b    4    4    5
b    8    3    4

并合并具有相同名称的列,同时保留相应的行名称(包含在第一列中),如下所示:

A    B
a    9
a    8
a    9
a    6
a    5
a    3
b    4
b    4
b    5
b    8
b    3
b    4

任何帮助将不胜感激。

【问题讨论】:

  • 如果你有“A B B C C\n1 2 3 4 5\n”,你想要什么输出? “A B C\n1 2 4\n1 3 5\n”还是“A B C\n1 2 4\n1 2 5\n1 3 4\n1 3 5\n”?如果是前者,那“A B B C C C\n”呢?
  • "A B C\n1 2 4\n1 3 5"
  • 那么 "A B B C C C\n1 2 3 4 5 6\n" 应该产生什么?

标签: perl rows multiple-columns names


【解决方案1】:

您正在尝试做的是“融化”一张桌子。我在 R 中为此使用了一个库,但在 Perl 中没有。有一个名为 Data::Table 的 Perl 模块,它确实具有用于多维列表的融化功能。

【讨论】:

【解决方案2】:

您可以将初始表 (T1) 可视化为:

0    1    2    3
A    B    B    B
a    9    8    9
...

您有第 0 列 .. 3. 每次打印转换表 (T2) 的行时,您将打印第 0 列。因此 T1 的第 1 行(“顶行”)将是以下第 1 行T2:

0    1

T1 的第 2 行将是 T2 的以下三行:

0    1
0    2
0    3

T1 的每一行,从第 2 行到最后一行,都将转换为 T2 的三行——如上所示。

伪代码:

  1. 获取T1线
  2. 将行拆分为元素
  3. 是 T1 的第 1 行(“顶行”)吗?如果是这样,则使用换行符打印元素 01。转到第 1 步。
  4. 这不是 T1 的第 1 行。打印以下内容,各占一行:元素01,元素02,元素03
  5. 转到步骤 1。

当使用while 读取文件或DATA 时,如何获取当前行号? Perl 使用$. 来存储该信息。所以如果$. == 1,就是第1行。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2021-09-07
    • 2020-01-02
    • 2020-10-25
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    相关资源
    最近更新 更多