r - 如何通过组合各个叶子路径来计算树的结果?

标签 r algorithm shell data-structures tree

假设我有一个输入文件,其中每一行都包含从根 (A) 到叶子的路径

echo "A\tB\tC\nA\tB\tD\nA\tE" > lines.txt
A   B   C
A   B   D
A   E

如何轻松生成结果树?:(A(B(C,D),E))

我喜欢使用 GNU 工具(awk、sed 等),因为它们更适合处理大文件,但 R 脚本也可以。 R 输入将是:

# lines <- lapply(readLines("lines.txt"), strsplit, " +")
lines <- list(list(c("A", "B", "C")), list(c("A", "B", "D")), list(c("A","E")))

最佳答案

在 Perl 中:

#!/usr/bin/env perl

use strict;

my $t = {};
while (<>) {
    my @a = split;
    my $t1 = $t;
    while (my $a = shift @a) {
        $t1->{$a} = {} if not exists $t1->{$a};
        $t1 = $t1->{$a};
    }
}

print &p($t)."\n";

sub p {
    my ($t) = @_;
    return
    unless keys %$t;

    return '('
        . join(',', map { $_ . p($t->{$_}) } sort keys %$t)
        . ')';
}

此脚本返回:

% cat <<EOF | perl l.pl
A   B   C
A   B   D
A   E
EOF
(A(B(C,D),E))

请注意,由于 p 中的递归,此脚本根本不适合大型数据集。但这可以通过将其转换为双 for 循环来轻松解决,就像上面的第一个 while 一样。

关于r - 如何通过组合各个叶子路径来计算树的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20294078/

相关文章:

r - 将脚本作为参数传递给 RGui

r - 在 r 中平均每 16 列

algorithm - 如何实现只有一个指针的双向链表?

algorithm - 为什么 DFS 在检查图是否为树时速度不够快

linux - 用于在特定时间间隔运行两个命令的 Bash 脚本

r - ggplot2:对列函数进行分面

r - gvisMerge + gvisAnnotatedTimeLine公共(public)RangeSelector

python-3.x - 如何高效地找到适当因子的多重性?

linux - 如何使用 uname -a 或 lsb_release -a 命令识别 linux 的风格?

shell - shell脚本中的$@和$*有什么区别?