Data-Frame
view release on metacpan or search on metacpan
lib/PDL/Factor.pm view on Meta::CPAN
package PDL::Factor;
$PDL::Factor::VERSION = '0.006005';
# ABSTRACT: PDL subclass for keeping categorical data
use 5.016;
use warnings;
use failures qw/levels::mismatch levels::number/;
use PDL::Lite (); # PDL::Lite is the minimal to get PDL work
use PDL::Core qw(pdl);
use PDL::Primitive qw(which);
use Module::Load;
use Ref::Util qw(is_plain_arrayref);
use Safe::Isa;
use Scalar::Util qw(blessed);
use Type::Params;
use Types::Standard qw(slurpy ArrayRef ConsumerOf Int);
use List::AllUtils ();
use parent 'PDL';
use Class::Method::Modifiers;
use Role::Tiny::With;
with qw(PDL::Role::Enumerable);
use overload
'==' => \&_eq,
'eq' => \&_eq,
'!=' => \&_ne,
'ne' => \&_ne,
fallback => 1;
# after stringifiable role is added, the string method will exist
eval q{
use overload (
'""' => \&PDL::Factor::string,
);
};
# check if given levels have duplicates
sub _check_levels {
my ( $class, $levels ) = @_;
my %levels;
for my $i ( 0 .. $#$levels ) {
if ( ( $levels{ $levels->[$i] }++ ) > 0 ) {
die "levels element [$i] is duplicated";
}
}
}
# extract levels from piddle or arrayref
sub _extract_levels {
my ( $class, $x ) = @_;
state $levels_from_arrayref = sub {
my ($aref) = @_;
# Sort levels if levels is not given on construction.
my @uniq = sort { $a cmp $b } List::AllUtils::uniq(@$aref);
return \@uniq;
};
if ( $x->$_DOES('PDL') ) { # PDL
$x = $x->slice( which( $x->isgood ) ) if $x->badflag;
if ( $x->$_DOES('PDL::SV') ) {
return $levels_from_arrayref->( [ $x->list ] );
}
else {
return $levels_from_arrayref->( [ $x->uniq->qsort->list ] );
}
}
( run in 0.560 second using v1.01-cache-2.11-cpan-39bf76dae61 )