Одной из возможностей dplyr
может быть:
df %>%
group_by(return_rleid = {return_rleid = rle(return > 3); rep(seq_along(return_rleid$lengths), return_rleid$lengths)}) %>%
mutate(Consec_days = ifelse(return <= 3, NA, seq_along(return_rleid))) %>%
ungroup() %>%
select(-return_rleid)
date return Consec_days
<date> <dbl> <int>
1 2019-02-20 1.00 NA
2 2019-02-21 2.50 NA
3 2019-02-22 2.00 NA
4 2019-02-23 3.00 NA
5 2019-02-24 5.00 1
6 2019-02-25 6.50 2
7 2019-02-26 1.00 NA
8 2019-02-27 9.00 1
9 2019-02-28 3.00 NA
10 2019-03-01 2.00 NA
Сначала выполняется группировка по идентификатору группы длин серий. Во-вторых, если «return» больше 3, он создает последовательность вокруг идентификатора группы длин серий, в противном случае присваивает. Наконец, он разгруппируется и удаляет избыточную переменную.
Или то же самое, но генерация последовательности по gl()
:
df %>%
group_by(return_rleid = {return_rleid = rle(return > 3); rep(seq_along(return_rleid$lengths), return_rleid$lengths)}) %>%
mutate(Consec_days = ifelse(return <= 3, NA, gl(length(return_rleid), 1))) %>%
ungroup() %>%
select(-return_rleid)
Это волшебство. В частности, во время магии (описано в perlsyn
, perlop
и, возможно, в других местах, которые я не помню). Perl позволяет использовать некоторые сокращенные обозначения. Если вы хотите увидеть, что Perl делает за вашей спиной, вы можете использовать B :: Deparse
. Вот файл, в котором используется сокращенный цикл:
#!/usr/bin/perl
use strict;
use warnings;
opendir my $dir, "/tmp" or die "$!";
while (my $file = readdir($dir)) {
print "$file\n";
}
Если вы запустите perl -MO = Deparse filename.pl
, вы получите код, который видит Perl:
use warnings;
use strict 'refs';
die "$!" unless opendir my $dir, '/tmp';
while (defined(my $file = readdir $dir)) {
do {
print "$file\n"
};
}
filename.pl syntax OK