{"id":332870,"date":"2022-05-06T15:00:58","date_gmt":"2022-05-06T15:00:58","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=332870"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=332870","title":{"rendered":"<span>\u0414\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442 \u0438 \u0446\u0438\u043a\u043b\u044b-\u0446\u0438\u043a\u043b\u044b-\u0446\u0438\u043a\u043b\u044b\u2026<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/dd\/mh\/hz\/ddmhhzy8egyq4t1abitzpo8_cey.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/dd\/mh\/hz\/ddmhhzy8egyq4t1abitzpo8_cey.jpeg\" data-blurred=\"true\"\/><br \/>  <em>\u00abHow I Met Your Mother\u00bb, season 6, ep. 7<\/em><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041a\u043e\u043b\u044f \u043b\u044e\u0431\u0438\u0442 \u0446\u0438\u043a\u043b\u044b.  \u0422\u043e\u043b\u044f \u043b\u044e\u0431\u0438\u0442 \u0446\u0438\u043a\u043b\u044b.  \u041e\u043b\u044f \u043b\u044e\u0431\u0438\u0442 \u0446\u0438\u043a\u043b\u044b.  \u0412\u0441\u0435 \u043b\u044e\u0431\u044f\u0442 \u0446\u0438\u043a\u043b\u044b.   \u0418 \u0421\u0435\u0440\u0435\u0436\u0430 \u0442\u043e\u0436\u0435.<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0434\u0438\u043d \u041c\u0430\u043c\u0431\u0430 \u0438\u0445 \u043d\u0435 \u043b\u044e\u0431\u0438\u0442. \u0418 \u0432\u043e\u0442 \u043f\u043e\u0447\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0441\u043a\u0438\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0438\u043a\u043b\u043e\u043c \u0438\u043b\u0438 goto, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0440\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u044b:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0446\u0438\u043a\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443. \u041d\u043e \u0442\u0443\u0442 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b.<\/li>\n<li>\u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0446\u0438\u043a\u043b\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u2014 \u0441\u0438\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0441\u0430\u0434\u043a\u0430 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0410 \u0443 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 \u0435\u0449\u0435 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442 \u0446\u0438\u043a\u043b\u0430.<\/li>\n<li>\u041d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0446\u0438\u043a\u043b\u0430 (<code>break<\/code>, <code>continue<\/code>) \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u0410 \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0446\u0438\u043a\u043b \u043f\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044f\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u043d\u043e. \u0412 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b. \u0415\u0441\u043b\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u2014 \u043d\u0430\u0434\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u044f\u0432\u043d\u043e.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 <a href=\"https:\/\/habrahabr.ru\/users\/i_shutov\/posts\/\" rel=\"nofollow noopener noreferrer\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0433\u043b\u044f\u0434\u0438\u043c \u043d\u0430 \u0446\u0438\u043a\u043b\u044b \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0435\u043a.<\/p>\n<p>  <\/p>\n<p>\u041e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u043e\u043c\u0443.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/qg\/co\/hw\/qgcohwzswkgn9m8ccwz3nb4ou8w.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/qg\/co\/hw\/qgcohwzswkgn9m8ccwz3nb4ou8w.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  <\/p>\n<h1 id=\"primer-1-iterirovanie-po-strokam\">\u041f\u0440\u0438\u043c\u0435\u0440 1. \u0418\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c<\/h1>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 <code>map<\/code>-\u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0442\u043e\u043b\u0431\u0446\u044b <code>data.table<\/code>-\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">library(data.table) library(magrittr)  data.table(         col_a = c(1, 2, 3),         col_b = c('id', 'aa', 'foo')  ) %>%  purrr::map(~ print(.x)) # [1] 1 2 3 # [1] \"id\"  \"aa\"  \"foo\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u043b \u0421\u0422\u0420\u041e\u041a\u0418 (\u0442.\u0435. \u0431\u044b\u043b\u043e 3 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438, \u0430 \u043d\u0435 2)?<\/p>\n<p>  <\/p>\n<h2 id=\"reshenie-bez-ciklov\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0446\u0438\u043a\u043b\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0434\u0430\u0436\u0435 \u0431\u044b\u043b \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u0446\u0435\u043b\u044b\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 Jenny Bryan <a href=\"https:\/\/github.com\/jennybc\/row-oriented-workflows\" rel=\"nofollow noopener noreferrer\">\u00abRow-oriented workflows in R with the tidyverse\u00bb<\/a>. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441 \u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0448\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442, \u043a\u043e\u0441\u043d\u0435\u043c\u0441\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0438. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c \u043d\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430, \u0430 \u0442\u0443\u0442 \u043e\u043d \u0435\u0449\u0435 \u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0439. \u041d\u0438\u0436\u0435 \u0434\u0432\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>paste<\/code> \u0432\u0437\u044f\u0442\u0430 \u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">library(tidyverse) library(data.table) # data.table::update.dev.pkg()  dt &lt;- data.table(   col_a = c(1, 2, 3),   col_b = c('id', 'aa', 'foo')  )  bench::mark(   # \u041f\u043e\u0434\u0445\u043e\u0434 1   # https:\/\/github.com\/Rdatatable\/data.table\/issues\/1732   # https:\/\/github.com\/Rdatatable\/data.table\/blob\/master\/NEWS.md   # v1.14.3 \u043f.39   dt[, s := paste(col_a, col_b, sep = \"&lt;>\"), by = .I],   # \u041f\u043e\u0434\u0445\u043e\u0434 2   rowwise(dt) %>%     mutate(s = paste(col_a, col_b, sep = \"&lt;>\")),   check = FALSE )<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">## # A tibble: 2 \u00d7 6                         ##   expression                                   min   median ##   &lt;bch:expr>                              &lt;bch:tm> &lt;bch:tm> ## 1 dt[, `:=`(s, paste(col_a, col_b, se ...  473.1\u00b5s  505.1\u00b5s ## 2 rowwise(dt) %>% mutate(s = paste(co ...   3.43ms    3.6ms<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0440\u0430\u0437\u0440\u044b\u0432 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439. \u0412\u044b\u0432\u043e\u0434\u044b \u0434\u0430\u043b\u0435\u0435 \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0441\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<h1 id=\"primer-2-dekartovo-proizvedenie-mnozhestv\">\u041f\u0440\u0438\u043c\u0435\u0440 2. \u0414\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432<\/h1>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430. \u041d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0434\u043b\u044f \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432. \u041a\u0430\u043a\u043e\u0439 \u043f\u0443\u0442\u044c \u0431\u0443\u0434\u0435\u0442 best practice? \u041f\u043e\u043d\u0438\u043c\u0430\u044e \u0447\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043b\u0443\u0447\u0448\u0435, \u043d\u043e \u0446\u0438\u043a\u043b \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u043e (<code>break<\/code> \u0438 \u0442.\u0434.).<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0432\u0441\u043a\u0438\u0434\u043a\u0443 \u0432\u0438\u0434\u043d\u044b \u043f\u0430\u0440\u044b \u043f\u0443\u0442\u0435\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># 1. \u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b for (i in 1:10){   for(j in 2:3){     print(i*j)   }}  # 2. \u0418\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 map\/apply expand.grid(1:10, 2:3) -> z purrr::map2_dbl(z$Var1, z$Var2, .f = ~{.x * .y})<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"reshenie-bez-ciklov-1\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0446\u0438\u043a\u043b\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u041e\u0441\u0442\u0430\u0432\u0438\u043c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0443, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445 \u043f\u0443\u0442\u0435\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043b\u0443\u0447\u0448\u0435, \u043d\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043d\u0430 \u0448\u0430\u0433, \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0447\u0443\u0442\u044c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443. \u0427\u0442\u043e \u0432\u0438\u0434\u0438\u043c? \u0411\u0430, \u0434\u0430 \u044d\u0442\u043e \u0436\u0435 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446, \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0430\u043b\u0433\u0435\u0431\u0440\u0430, 1-\u044b\u0439 \u043a\u0443\u0440\u0441.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ou\/_g\/wg\/ou_gwgmqlsqlzlelu93s1q7vetw.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ou\/_g\/wg\/ou_gwgmqlsqlzlelu93s1q7vetw.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">matrix(1:10, ncol = 1) %*% matrix(2:3, nrow = 1)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e, \u0434\u0430\u0436\u0435 \u0432 \u0441\u043b\u0435\u0433\u043a\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u044f\u043c\u044b\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0440\u0430\u0437\u0433\u0440\u043e\u043c\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u044e\u0442 \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. 2-3 \u043f\u043e\u0440\u044f\u0434\u043a\u0430!!!<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">m1 &lt;- matrix(1:10, ncol = 1) m2 &lt;- matrix(2:3, nrow = 1) z &lt;- expand.grid(1:10, 2:3)  bench::mark(   m1 %*% m2,   transform(z, val = Var1 * Var2),   check = FALSE )<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"primer-3-okonnye-edinichnye-matricy\">\u041f\u0440\u0438\u043c\u0435\u0440 3. \u041e\u043a\u043e\u043d\u043d\u044b\u0435 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b<\/h1>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 9.<\/p>\n<p>  <\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 2 \u0441\u0443\u043c\u043c\u044b \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432. \u0421 1 \u043f\u043e 3 \u0441\u0442\u0440\u043e\u043a\u0443<br \/>  \u043f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 1:3 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u0432\u0442\u043e\u0440\u043e\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b,<br \/>  \u0441 4 \u043f\u043e 6 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 4:6 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u0432\u0442\u043e\u0440\u043e\u0435<br \/>  \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441 7 \u043f\u043e 9 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d<br \/>  \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 7:9 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u0432\u0442\u043e\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">my_mat &lt;- matrix(seq(1, 81), nrow = 9, ncol = 9, byrow = TRUE)  c1 &lt;- rep(c(1, 4, 7), each = 3) c2 &lt;- rep(c(3, 6, 9), each = 3)  lapply(1:nrow(my_mat), function(i) {   cont &lt;- my_mat[i, ]   c(sum(cont[c1[i]:c2[i]]),     sum(cont[-(c1[i]:c2[i])])) })<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"reshenie-bez-ciklov-2\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0446\u0438\u043a\u043b\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0432 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443, \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435. \u0411\u0435\u0433\u0443\u0449\u0435\u0435 \u043e\u043a\u043d\u043e 3*3 (\u0441\u043f\u0440\u0430\u0439\u0442) \u043f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438. \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441\u0443\u043c\u043c\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430 \u0447\u0430\u0441\u0442\u044c \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0435 \u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0430\u043a \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e \u0438 \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0448\u0430\u0442\u044c. \u041e\u043f\u044f\u0442\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0430\u043b\u0433\u0435\u0431\u0440\u0430 \u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">my_mat &lt;- matrix(seq(1, 81), nrow = 9, ncol = 9, byrow = TRUE)  # \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443-\u043e\u043a\u043d\u043e b1 &lt;- unlist(rep(list(rep(1L, 3), rep(0L, 6)), 3)) b2 &lt;- unlist(rep(list(b1, rep(0L, 3)), 3))  e_mat &lt;- matrix(b2, ncol = 9, byrow = TRUE)[1:9, ]  # \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 s1 &lt;- rowSums(my_mat * e_mat) s2 &lt;- rowSums(my_mat) - s1<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">tibble::tibble(s1, s2)<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">## # A tibble: 9 \u00d7 2 ##      s1    s2 ##   &lt;dbl> &lt;dbl> ## 1     6    39 ## 2    33    93 ## 3    60   147 ## 4    96   192 ## 5   123   246 ## 6   150   300 ## 7   186   345 ## 8   213   399 ## 9   240   453<\/code><\/pre>\n<p>  <\/p>\n<p>C\u0430\u043c\u043e \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0435\u0435 \u043e\u043a\u043d\u043e<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] ##  [1,]    1    1    1    0    0    0    0    0    0 ##  [2,]    1    1    1    0    0    0    0    0    0 ##  [3,]    1    1    1    0    0    0    0    0    0 ##  [4,]    0    0    0    1    1    1    0    0    0 ##  [5,]    0    0    0    1    1    1    0    0    0 ##  [6,]    0    0    0    1    1    1    0    0    0 ##  [7,]    0    0    0    0    0    0    1    1    1 ##  [8,]    0    0    0    0    0    0    1    1    1 ##  [9,]    0    0    0    0    0    0    1    1    1<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"primer-4-taynaya-svyaz-mezhdu-sobytiyami\">\u041f\u0440\u0438\u043c\u0435\u0440 4. \u0422\u0430\u0439\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438<\/h1>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c <code>data.frame<\/code> \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0438 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043d\u0430\u0439\u0442\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0446\u0435\u043b\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u0430 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: 1914-\u0442\u0438\u0433\u0440, 1938-\u0442\u0438\u0433\u0440 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 = 24 \u0433\u043e\u0434\u0430, \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c 1938-\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c 1940 = 24 \u043c\u0435\u0441\u044f\u0446\u0430. \u0422.\u0435. \u043f\u043e\u0438\u0441\u043a \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043a\u0430\u043a \u043c\u0435\u0436\u0434\u0443 24 \u0433\u043e\u0434\u0430\u043c\u0438 \u0438 24000 \u0447\u0430\u0441\u043e\u0432 \u2014 \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0447\u0438\u0441\u043b\u0430. 1986 \u0427\u0435\u0440\u043d\u043e\u0431\u044b\u043b\u044c \u0422\u0438\u0433\u0440 \u2014 2022 \u0442\u0438\u0433\u0440 = 36 \u043b\u0435\u0442, 26 \u0430\u043f\u0440\u0435\u043b\u044f 1986 \u2014 05 \u043c\u0430\u044f 2022.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/hd\/5p\/4b\/hd5p4bbuqf2_knoaw1mykkrv96e.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/hd\/5p\/4b\/hd5p4bbuqf2_knoaw1mykkrv96e.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0432\u0438\u0434\u0438\u0442 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u0442\u043e \u0442\u0443\u0442 \u0436\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0446\u0438\u043a\u043b\u044b \u0432 \u0446\u0438\u043a\u043b\u0430\u0445, \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0440\u043e\u0447\u0430\u044f \u0433\u0438\u0434\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432! \u0412\u0441\u0435 \u043a\u0430\u043a \u0443 \u0432\u0437\u0440\u043e\u0441\u043b\u044b\u0445.<\/p>\n<p>  <\/p>\n<h2 id=\"reshenie-bez-ciklov-3\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0446\u0438\u043a\u043b\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0430\u043b\u0433\u0435\u0431\u0440\u0443. \u00ab\u041a\u043e\u043b\u044c\u0446\u043e \u0432\u044b\u0447\u0435\u0442\u043e\u0432 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e n\u00bb (\u043f\u0443\u0441\u0442\u044c \u0441\u0443\u0440\u043e\u0432\u044b\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0435 \u0432\u043e\u0437\u043c\u0443\u0449\u0430\u044e\u0442\u0441\u044f, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438). \u0422.\u0435. \u0432 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u0441\u0435\u0433\u043e-\u043d\u0430\u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0447\u0438\u0441\u0435\u043b \u043a\u043b\u0430\u0441\u0441\u044b \u0432\u044b\u0447\u0435\u0442\u043e\u0432 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e <code>n<\/code>, \u0433\u0434\u0435 <code>n<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044f\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u043c\u0438. \u0417\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443!<\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0443 \u043d\u0435\u0434\u0435\u043b\u044e.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">library(tidyverse)  # \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 t_df &lt;- as.integer(runif(20, 19150, 19200)) %>%   unique() %>%   tibble(date = as.Date(., origin = \"1970-01-01\"), i_date = .)  # \u0440\u0435\u0448\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0412\u0421\u0415 \u0413\u0420\u0423\u041f\u041f\u042b \u0434\u0430\u0442 \u0432 7-\u0434\u043d\u0435\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 df &lt;- mutate(t_df, grp = i_date %% 7)  vtree::vtree(df, \"grp date\", horiz = FALSE)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/x3\/tk\/fg\/x3tkfgswy0bsyx3woazo10aakl0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/x3\/tk\/fg\/x3tkfgswy0bsyx3woazo10aakl0.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f. \u0415\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>  <\/p>\n<h1 id=\"primer-5-cifrovoy-hrapovik\">\u041f\u0440\u0438\u043c\u0435\u0440 5. \u0426\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0445\u0440\u0430\u043f\u043e\u0432\u0438\u043a<\/h1>\n<p>  <\/p>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u043a\u0430 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0412\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u0435\u0440\u0443\u043d\u0434\u0430, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b. <\/p>\n<p>  <\/p>\n<p>\u0421\u0442\u0440\u043e\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0434\u043b\u044f <code>x<\/code> \u043e\u0442 1 \u0434\u043e 10.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b <code>(1, 4, 7)<\/code> \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443.<\/p>\n<p>  <\/p>\n<p>\u0425\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>z = 1, 1, 1, 2, 2, 2, 3, 3, 3, 3<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0442\u0443\u0442 \u0436\u0435 \u0440\u0430\u0441\u0447\u0435\u0445\u043b\u044f\u0435\u0442 \u0446\u0438\u043a\u043b\u044b. \u041d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043f\u0440\u0438\u0437\u0435\u043c\u043b\u044f\u0435\u043c \u043d\u0430 \u0432\u0437\u043b\u0435\u0442\u0435.<\/p>\n<p>  <\/p>\n<h2 id=\"reshenie-bez-ciklov-4\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0446\u0438\u043a\u043b\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u043e \u0432\u0430\u0436\u043d\u0430\u044f. \u042d\u0442\u043e \u0436\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u0440\u043e \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/ww\/-x\/pu\/ww-xpuktz218espt8odnhno5she.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/ww\/-x\/pu\/ww-xpuktz218espt8odnhno5she.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  <\/p>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041f\u0435\u0440\u0432\u043e\u0435 \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">x &lt;- rep_len(0L, 10) y &lt;- c(1,4,7) x[y] &lt;- 1L cumsum(x)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0443 \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c. \u041f\u043e \u0441\u0443\u0442\u0438, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u044f\u0432\u043b\u044f\u044e\u0449\u0443\u044e\u0441\u044f \u0441\u0443\u043c\u043c\u043e\u0439 \u0442\u0440\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0425\u0435\u0432\u0438\u0441\u0430\u0439\u0434\u0430. \u041d\u0443 \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 10-\u0442\u0438 \u0442\u043e\u0447\u043a\u0430\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">ff &lt;- function(x) {   sum(purrr::map_dbl(c(1, 4, 7),  ~ x >= .x)) }  purrr::map_dbl(1:10, ff) <\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"primer-6-seriynye-pokupki\">\u041f\u0440\u0438\u043c\u0435\u0440 6. \u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0435 \u043f\u043e\u043a\u0443\u043f\u043a\u0438<\/h1>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0430\u0439\u0434\u0438\u0448\u043d\u0438\u043a\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u044e\u0442 \u043f\u043e\u043a\u0443\u043f\u043a\u0438. \u041e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u0430\u0439\u0434\u0438\u0448\u043d\u0438\u043a\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f. \u041d\u0430\u0434\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u043a\u0430\u043a\u0430\u044f \u044d\u0442\u043e \u043f\u043e \u0441\u0447\u0451\u0442\u0443 \u043f\u043e\u043a\u0443\u043f\u043a\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0438\u0442\u043e\u043d\u0435 \u0442\u0443\u0442 \u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0438\u043a\u043b\u044b \u0432 \u0446\u0438\u043a\u043b\u0430\u0445. \u0426\u0438\u043a\u043b \u043f\u043e \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u044f\u043c, \u0446\u0438\u043a\u043b \u043f\u043e \u043f\u043e\u043a\u0443\u043f\u043a\u0430\u043c\u2026 \u0412\u0441\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0446\u0438\u043a\u043b\u044b \u0432\u0431\u0438\u0432\u0430\u044e\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u0437\u0430\u043d\u044f\u0442\u0438\u044f\u0445 \u0438 \u0434\u0430\u043b\u0435\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u044f\u044e\u0442 \u044d\u0442\u043e \u0437\u043d\u0430\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<h2 id=\"reshenie-bez-ciklov-5\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0446\u0438\u043a\u043b\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e \u0438 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 \u0437\u0430\u043a\u0443\u043b\u0438\u0441\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438. \u041e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0439\u0442\u0438 \u043e\u0442 \u0445\u0430\u043e\u0441\u0430 \u043a \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0437\u0430\u0434\u0430\u0447 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">library(data.table) nn &lt;- 20 dt &lt;- data.table(id = sample(1:5, nn, replace = TRUE),                   cost = runif(nn, 100, 200)) # \u0440\u0435\u0448\u0430\u0435\u043c dt[, tmp := 1L, by = id][, n_in := cumsum(tmp), by = id]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u0438\u0434\u0435\u0442\u044c \u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c, \u0447\u0442\u043e \u0438 \u044d\u0442\u043e \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u043d\u0430 \u0441\u0447\u0435\u0442\u0430\u0445. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 (\u043f\u043e\u0441\u043b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0432\u0435\u0434\u044c \u0442\u0430\u043c \u0435\u0449\u0435 \u0434\u0430\u0442\u044b \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c) \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u043e\u0433\u043e \u043d\u043e\u043c\u0435\u0440\u0430 \u043e\u0442 1 \u0434\u043e \u0434\u043b\u0438\u043d\u044b \u0433\u0440\u0443\u043f\u043f\u044b \u0441 \u0448\u0430\u0433\u043e\u043c 1.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">dt[, n_in_grp := 1:.N, by = id]<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439 \u0438 \u0441\u0430\u043c\u044b\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">       id     cost   tmp  n_in n_in_grp     &lt;int>    &lt;num> &lt;int> &lt;int>    &lt;int>  1:     5 126.4575     1     1        1  2:     5 196.6588     1     2        2  3:     1 108.1415     1     1        1  4:     4 183.2515     1     1        1  5:     4 112.6702     1     2        2  6:     4 173.0156     1     3        3  7:     4 182.0650     1     4        4  8:     5 119.7534     1     3        3  9:     2 190.9689     1     1        1<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"primer-7-passazhirskie-perevozki\">\u041f\u0440\u0438\u043c\u0435\u0440 7. \u041f\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u0441\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0437\u043a\u0438<\/h1>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0435\u0436\u0435\u043c\u0435\u0441\u044f\u0447\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043f\u0435\u0440\u0435\u0432\u0435\u0437\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u043e\u0432. \u0412 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>good_month<\/code> \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0435\u0445 \u043c\u0435\u0441\u044f\u0446\u0430\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043c\u0435\u0441\u044f\u0446\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0440\u0438\u0448\u043b\u043e \u043f\u043e\u043a\u0430 \u2014 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u043e\u043c <code>for<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c <code>if else<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043f\u0430\u0440\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f. <\/p>\n<p>  <\/p>\n<p>\u041f\u043e \u0438\u0434\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043f\u0430\u0440\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 <code>a[1]<\/code> \u0441 <code>a[2]<\/code>, \u043f\u043e\u0442\u043e\u043c <code>a[2]<\/code> \u0441 <code>a[3]<\/code>\u2026 \u0421 \u044d\u0442\u0438\u043c \u044f \u0435\u0449\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u043d\u043e \u0441\u0430\u043c\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e \u0437\u0430\u043d\u043e\u0441\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u043e\u0432 \u0438\u0437 \u043c\u0435\u0441\u044f\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043e\u0448\u0451\u043b \u043f\u043e\u0434 \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0432 \u043d\u043e\u0432\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0442.\u043a. \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u0442\u0443\u0442 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u043b\u043d\u0430\u044f. <\/p>\n<p>  <\/p>\n<h2 id=\"reshenie-bez-ciklov-6\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0446\u0438\u043a\u043b\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043a\u0430\u043a \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435.<\/p>\n<p>  <\/p>\n<p>\u0411\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u043d\u0430\u043f\u0435\u0440\u0441\u0442\u043e\u0447\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u043c \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0432 \u043a\u043e\u0434\u0435. <\/p>\n<p>  <\/p>\n<p>\u0412 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0438\u0437 \u043a\u043e\u0434\u0430 \u0441\u043c\u044b\u0441\u043b \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0437. \u0414\u0430\u0436\u0435 \u0431\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">library(data.table) library(magrittr)  # Seed: set.seed(1)  # \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 dt &lt;- seq(as.Date(\"2005-01-01\"), as.Date(\"2012-12-01\"),            by = \"1 month\") %>%   format(\"%Y%m\") %>%   data.table(ym = .) %>%   .[, `:=`(nr_pass = sample(1:100, .N), good_month = FALSE)]  # \u0420\u0435\u0448\u0435\u043d\u0438\u0435 setorder(dt, ym) %>%   .[nr_pass > shift(nr_pass), good_month := TRUE]  dt<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443.<\/p>\n<p>  <\/p>\n<h1 id=\"primer-8-vyborka-po-pacientam\">\u041f\u0440\u0438\u043c\u0435\u0440 8. \u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u043f\u043e \u043f\u0430\u0446\u0438\u0435\u043d\u0442\u0430\u043c<\/h1>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u0431\u0443\u0442\u044b\u043b\u043e\u0447\u043d\u043e\u0435 \u0433\u043e\u0440\u043b\u044b\u0448\u043a\u043e \u0432 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 (\u043d\u0443\u0436\u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e <code>Pat_ID<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f \u043f\u043e <code>Pat_ID<\/code> \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443). \u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e? \u0418\u0441\u0445\u043e\u0434\u043d\u043e \u0432 \u043d\u0430\u0431\u043e\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u0434\u0430\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u044b\u0439 \u0433\u0430\u043c\u0431\u0443\u0440\u0433\u0435\u0440 \u0441 \u0446\u0438\u043a\u043b\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a. \u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0430.<\/p>\n<p>  <\/p>\n<h2 id=\"reshenie-bez-ciklov-7\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0446\u0438\u043a\u043b\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f. \u0427\u0442\u043e\u0431\u044b \u0447\u0443\u0442\u044c \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<p>  <\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0430, \u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u043d\u044b\u0445 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u0418\u0434\u0435\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f. \u0421\u0432\u0435\u0440\u043d\u0435\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u0430\u0446\u0438\u0435\u043d\u0442\u0430 \u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0432 <code>int32<\/code> \u0445\u044d\u0448 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440.<\/p>\n<p>  <\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0446\u0435\u043d\u043e\u0447\u043a\u0438<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u041f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 10000 log(10^4) \/ log(2) # 14 \u0431\u0438\u0442 # \u0410 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u0446\u0438\u0435\u043d\u0442\u0430 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 1000 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 log(10^3) \/ log(2) # 10 \u0431\u0438\u0442 binaryLogic::as.binary(2^10) # \u0441\u0442\u0440\u043e\u0438\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440  \u043d\u0430 \u0431\u0430\u0437\u0435 Int 32: #   \u043f\u0430\u0446\u0438\u0435\u043d\u0442 31-11 \u0431\u0438\u0442\u044b, \u0437\u0430\u043f\u0438\u0441\u044c 10-1 \u0431\u0438\u0442\u044b<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0448\u0430\u0435\u043c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">library(tidyverse) library(data.table) library(bench)  # \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 df &lt;- 1:10^4 %>%   tibble(pat_id = ., len = runif(length(.), 600, 900)) %>%   rowwise() %>%   mutate(val = list(sample.int(len, replace = FALSE))) %>%   ungroup() %>%   select(-len) %>%   unnest(val)   # \u0440\u0435\u0448\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 base_dt &lt;- as.data.table(df) %>%   # \u0441\u0442\u0440\u043e\u0438\u043c \u0445\u044d\u0448-\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440   .[, uid := .GRP * as.integer(2^10) + seq_len(.N), by = pat_id]  # \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 N \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b # \u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 system.time({ dt &lt;- data.table(shuff_uid = dqrng::dqsample(base_dt$uid, replace = FALSE)) %>%   # \u0440\u0430\u0441\u0449\u0435\u043f\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u043f\u0430\u0446\u0438\u0435\u043d\u0442\u0430 \u0438 \u0433\u0440\u0443\u043f\u043f\u0443   .[, pat_id := shuff_uid %\/% 2^10] %>%   # \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u043e 5 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439   .[, .(uid = head(shuff_uid, 5)), by = pat_id] %>%   # \u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043f\u0430\u0446\u0438\u0435\u043d\u0442\u0430\u043c   .[, pat_id := NULL] %>%   merge(base_dt, all.x = TRUE, by = \"uid\") })  skimr::skim(dt)<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0417\u0430\u043e\u0434\u043d\u043e \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. 5 \u0440\u0430\u0437 \u2014 \u0432\u0435\u0441\u044c\u043c\u0430 \u043e\u0449\u0443\u0442\u0438\u043c\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 bench::mark(   base_dt[, shuff_uid := base::sample(uid, replace = FALSE)],   base_dt[, shuff_uid := dqrng::dqsample(uid, replace = FALSE)] )<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">## # A tibble: 2 \u00d7 6 ...   ##   expression                              ...     min median ##   &lt;bch:expr>                              ...   &lt;bch> &lt;bch:> ## 1 base_dt[, `:=`(shuff_uid, base::sample( ...   989ms  989ms ## 2 base_dt[, `:=`(shuff_uid, dqrng::dqsamp ...   228ms  229ms<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0414\u0430\u043b\u0435\u0435 \u0441\u0435\u0440\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u043d\u0430\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u0439.<\/strong><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u043b, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f <code>data.table<\/code> \u0435\u0441\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 <code>tidyr<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, <a href=\"https:\/\/tysonbarrett.com\/tidyfast\/index.html\" rel=\"nofollow noopener noreferrer\"><code>tidyfast<\/code><\/a> \u0438 <a href=\"https:\/\/hope-data-science.github.io\/tidyfst\/index.html\" rel=\"nofollow noopener noreferrer\"><code>tidyfst<\/code><\/a>. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u0445\u043e\u0434\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 list-column.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">library(data.table)  data &lt;- data.table(   x = c(1,2,3), y = c(2,3,4), z = list(c(1,2), c(1,1), c(2,3)) )  # Hate this: tidyr::unnest(data,cols = c(\"z\")) # Ugly: data[, lapply(.SD,unlist), by = 1:nrow(data)] # Alternative: tidyfst::unnest_dt(data, z)<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"primer-9-schitaem-vozrastnye-gruppy\">\u041f\u0440\u0438\u043c\u0435\u0440 9. \u0421\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b<\/h1>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439. \u0412 \u043d\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0443. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043b\u043b\u0435\u0433 \u043c\u043b\u0430\u0434\u0448\u0435 \u0435\u0433\u043e.<\/p>\n<p>  <\/p>\n<p>\u0418\u0437 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043d\u0438\u0436\u0435 <code>pid<\/code> \u2014 personal_id, <code>yob<\/code> \u2014 year_of_birth, <code>fid<\/code> \u2014 firm_id.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/stackoverflow.com\/questions\/71717446\/data-table-aggregation-based-on-multiple-criteria\/71720047?noredirect=1#comment126761224_71720047\" rel=\"nofollow noopener noreferrer\">SO<\/a>.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0420\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0437 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 (\u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430).<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">library(data.table) library(tictoc)  #Make it replicable: set.seed(1)  #Define parameters of the simulation: pid &lt;- 1:1000 fid &lt;- 1:5 time_periods &lt;- 1:12 yob &lt;- sample(seq(1900, 2010), length(pid), replace = TRUE)  #Obtain in how many firms a given pid works in a givem month: nr_firms_pid_time &lt;- sample(1:length(fid), length(pid), replace = TRUE)  #Aux functions: function_rep&lt;-function(x){   rep(1:12, x) }  function_seq&lt;-function(x){   1:x }  #Create panel data_panel &lt;- data.table(pid = rep(pid,nr_firms_pid_time*length(time_periods))) data_panel[, yearmonth := do.call(c,sapply(nr_firms_pid_time,function_rep))] data_panel[, fid := rep(do.call(c, sapply(nr_firms_pid_time,function_seq)), each = 12)]  #Merge in yob: data_yob &lt;- data.table(pid = pid, yob = yob) data_panel &lt;- merge(data_panel, data_yob, by = c(\"pid\"), all.x = TRUE)  #Solution 1 (terribly slow): # make a small function that counts the number of coworkers with # earlier dob than this individual older_coworkers = function(id, yrmonth) {   #First obtain firms in which a worker works in a given month:   id_firms &lt;- data_panel[pid == id &amp; yearmonth == yrmonth, fid]   #Then extract data at a given month:   data_func &lt;- data_panel[(fid %in% id_firms) &amp; (yearmonth == yrmonth)]   #Then extract his dob:   dob_to_use &lt;- unique(data_func[pid == id,yob])   sum(data_func[pid!=id]$yob &lt; dob_to_use) }  #Works but is terrible slow: tic() sol_1 &lt;- data_panel[, .(older_coworkers(.BY$pid, .BY$yearmonth)), by = c(\"pid\", \"yearmonth\")] toc()  #Solution 2 (better but do not like it, what if I want unique older coworkers) function_older &lt;- function(x){   noc &lt;- lapply(     1:length(x),     function(i){       sum(x[-i] &lt; x[i])     }   )   unlist(noc) }  fSol2 &lt;- function(dt){   dt[, .(pid, function_older(yob)),by = c(\"fid\", \"yearmonth\")][, sum(V2),by = c(\"pid\", \"yearmonth\")][order(pid, yearmonth)] } # This is fast but I cannot get unique number: tic() sol_2 &lt;- fSol2(data_panel) toc()  # Everything works: identical(sol_1, sol_2)<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0418\u043c\u0435\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f ~70 \u0441\u0435\u043a\u0443\u043d\u0434 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438 ~0.7 \u0441\u0435\u043a\u0443\u043d\u0434 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c. \u0412\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u0446\u0438\u043a\u043b\u043e\u0432 \u044f\u0432\u043d\u044b\u0445 \u043d\u0435\u0442 \u0438 \u0432\u0440\u0435\u043c\u044f \u0432\u0440\u043e\u0434\u0435 \u043d\u0438\u0447\u0435\u0433\u043e, \u0442\u043e\u043b\u044c\u043a\u043e <code>lapply<\/code> \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442.<\/p>\n<p>  <\/p>\n<h2 id=\"reshenie-bez-ciklov-8\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0446\u0438\u043a\u043b\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 <code>lapply<\/code> \u0411\u0443\u0434\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \u0434\u0432\u0443\u0445 \u0446\u0435\u043b\u0435\u0439 \u2014 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c non-equi join \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0435\u0439. \u042d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043f\u043b\u043e\u0445 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0439\u0434\u0435\u0442 &#171;\u0440\u0430\u0437\u0434\u0443\u0432\u0430\u043d\u0438\u0435&#187; \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0433\u043b\u044f\u0434\u0438\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 uid, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443 \u043c\u0435\u043d\u044c\u0448\u0435 df &lt;- data_panel %>%   .[data_panel[, .(pid, yearmonth, fid, yob_x = yob)],     .(x.pid, i.pid, yearmonth, fid),     on = .(yearmonth, fid, yob &lt; yob_x)] %>%   .[, .N, by = .(x.pid, yearmonth)]  df<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043d\u043e\u0443\u0442\u0435 ~2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0441\u044d\u043c\u043f\u043b\u0435. \u041d\u0435 \u0444\u043e\u043d\u0442\u0430\u043d, \u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e. <\/p>\n<p>  <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c \u043d\u0430\u0434 \u0441\u0443\u0442\u044c\u044e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e. \u0421\u0442\u0430\u0440\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043b\u044e\u0434\u0435\u0439 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435, \u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0448\u043a\u0430\u043b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u0430\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0445 \u043b\u044e\u0434\u0435\u0439 \u043f\u043e \u0448\u043a\u0430\u043b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043d\u0430\u0441 \u043e\u0442 \u0445\u0430\u043e\u0441\u0430 \u043a \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0443. \u0418 \u043c\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u043b\u043e\u0434\u044b\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u043b\u044f\u043d\u0443\u0432 \u043d\u0430 \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u044d\u0442\u043e\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435! <\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0433\u043e\u0434 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0443 \u043c\u043d\u043e\u0433\u0438\u0445 \u043b\u044e\u0434\u0435\u0439 \u2014 \u043a\u0430\u043a \u0438\u0445 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443? \u041d\u043e \u044d\u0442\u043e \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u043c\u044b \u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0445, \u043a\u0442\u043e \u043c\u043e\u043b\u043e\u0436\u0435, \u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0441\u0435\u0445 \u043f\u043e\u0433\u043e\u0434\u043a\u043e\u0432 \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a (\u0432\u043e\u0442 \u0438 list-column) \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u0438\u043d\u0435\u0439\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0441\u0435\u0433\u043e \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u0447\u0435\u043a.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">library(data.table) fSol3  &lt;- function(dt){   dt %>%     .[, .(pid = list(pid)), by = .(yearmonth, fid, yob)] %>%     .[, ll := lengths(pid)] %>%     setorder(yob) %>%     .[, n_corr := shift(cumsum(ll), fill = 0, type = \"lag\"),                     by = .(fid, yearmonth)] %>%     tidyfst::unnest_dt(pid) %>%     # \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u043f\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c     .[, .(V1 = sum(n_corr)), by = .(pid, yearmonth)] }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043e\u0434\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430. \u0412 \u0438\u0442\u043e\u0433\u0435, \u043f\u0443\u0442\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0443\u043c\u043e\u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0438\u043c\u0435\u0435\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0435\u0449\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a!<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">library(tidyverse)  set.seed(1) # \u0433\u0435\u043d\u0435\u0440\u0438\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u0432\u0435\u0441 udict_df &lt;- tibble(pid = 1:1000) %>%   # \u0433\u043e\u0434 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438 \u0447\u0438\u0441\u043b\u043e \u0444\u0438\u0440\u043c \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u043b   mutate(yob = sample(1900:2010, nrow(.), replace = TRUE),          nf = sample(1:5, nrow(.), replace = TRUE))  data_df &lt;- udict_df %>%   rowwise() %>%   # \u0432\u0433\u043e\u043d\u044f\u0435\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0444\u0438\u0440\u043c \u0438 \u043c\u0435\u0441\u044f\u0446\u0430   mutate(fid = list(sample(1:5, nf)), yearmonth = list(1:12)) %>%   ungroup() %>%   select(-nf) %>%   unnest(cols = fid) %>%   unnest(cols = yearmonth)  # dt &lt;- as.data.table(data_df) dt &lt;- copy(data_panel)  tic() res_dt &lt;- fSol3(dt) toc()  dplyr::all_equal(sol_2, res_dt) waldo::compare(sol_2, setorder(res_dt, pid, yearmonth))  bench::mark(   fSol2(data_panel),   fSol3(dt),   check = FALSE )<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u041d\u0443 \u00ab\u043d\u0438\u0447\u043e\u0441\u0438\u0442\u0430\u043a\u00bb \u043d\u0430 \u0440\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435.<\/p>\n<p>  <\/p>\n<h2 id=\"a-tibble-2--6\">A tibble: 2 \u00d7 6<\/h2>\n<p>  <\/p>\n<pre><code class=\"plaintext\">##   expression             min   median `itr\/sec` mem_alloc `gc\/sec` ##   &lt;bch:expr>        &lt;bch:tm> &lt;bch:tm>     &lt;dbl> &lt;bch:byt>    &lt;dbl> ## 1 fSol2(data_panel)  318.2ms  319.7ms     3.13   515.39MB     3.13 ## 2 fSol3(dt)             1.5s     1.5s     0.665    4.45MB     0<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"primer-10-uskoryaem-difference-in-differences\">\u041f\u0440\u0438\u043c\u0435\u0440 10. \u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c Difference-in-Differences<\/h1>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0432 \u044d\u043a\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u2014 \u0440\u0430\u0441\u0447\u0435\u0442 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435. \u00abDifference in Differences\u00bb (DID). <\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435, \u043c\u043e\u0436\u043d\u043e \u0432 \u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c, \u0430 \u043c\u043e\u0436\u043d\u043e \u0438 \u0447\u0435\u0440\u0435\u0437 data.table.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/ho\/vs\/vq\/hovsvqkhdixturjr5cft6ilaq9u.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/ho\/vs\/vq\/hovsvqkhdixturjr5cft6ilaq9u.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0446\u0438\u043a\u043b\u043e\u0432. <\/p>\n<p>  <\/p>\n<p>\u0412 \u0442\u0435\u043e\u0440\u0438\u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u0435\u0440\u043d\u043e, \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438\u043c\u0435\u0435\u043c \u0437\u0430\u0441\u0430\u0434\u0443.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0440\u0443\u043f \u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 (\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0433\u0440\u0443\u043f\u044b), \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0433\u0434\u0435 \u0435\u0441\u0442\u044c 1000 \u0433\u0440\u0443\u043f \u0438 300 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u0432, \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041b\u043e\u043c\u0438\u043c\u0441\u044f \u043d\u0430\u043f\u0440\u043e\u043b\u043e\u043c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">library(data.table) library(tidyverse)  #Make it replicable: set.seed(1)  #Define parameters: n_units &lt;- 1000 n_periods &lt;- 100  #Generate the data: #First define units and when they are treated: data &lt;- data.table(   fid = 1:n_units,   treat_time = sample(c(0L, 25L, 75L, 50L), n_units, replace = TRUE) )  #Then add time: data &lt;- data[rep(data[, .I], n_periods)] setorder(data, fid) data[, time := rep(1:n_periods, n_units)]  #Add outcome: data[, y := rnorm(n_units * n_periods)]  # plot(density(data$time))  #Now start's the fun: #For each group defined by treat_time #I want to calculate the sample version of the following object: #(E[y|treat_time = x,t = t] - E[y|treat_time = x,t = treat_time-1]) - (E[y|treat_time = 0,t = t] - E[y|treat_time = 0,t = treat_time-1])  #For example for group 25: (mean(data[treat_time == 25 &amp; time == 2, y]) - mean(data[treat_time == 25 &amp; time == 24, y])) -    (mean(data[treat_time == 0 &amp; time == 2, y]) - mean(data[treat_time == 0 &amp; time == 24, y]))  #For group 25 for all time periods the solution would be something like this: for (t in 1:n_periods){   (mean(data[treat_time == 25 &amp; time == t, y]) - mean(data[treat_time == 25 &amp; time == 24, y])) -      (mean(data[treat_time == 0 &amp; time == t, y]) - mean(data[treat_time == 0 &amp; time == 24, y])) }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430 CRAN, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/cran.r-project.org\/web\/packages\/did\/\" rel=\"nofollow noopener noreferrer\">did<\/a>, <a href=\"https:\/\/cran.r-project.org\/web\/packages\/did2s\/\" rel=\"nofollow noopener noreferrer\">did2s<\/a>. \u041f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u043e\u0447\u0435\u043a \u0438 \u0433\u0440\u0443\u043f\u043f, \u0441\u043e \u0441\u043b\u043e\u0432 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u0417\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442 \u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0446\u0438\u043a\u043b\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0430\u0441\u0447\u0435\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0440\u0430\u0441\u0447\u0435\u0442\u0430. \u041e\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e <code>(a-b)-(c-d) = a+d-b-c<\/code>. \u0411\u0435\u0434\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>  <\/p>\n<p>\u041e\u0442\u0441\u044e\u0434\u0430 \u0432\u0438\u0434\u0435\u043d \u043f\u043b\u0430\u043d \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0412\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0437\u0430 \u0441\u043a\u043e\u0431\u043a\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u044b.<\/li>\n<li>\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0442\u043a\u0443 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432.<\/li>\n<li>\u0412 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u0435\u0442\u043a\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>a, b, c, d<\/code> \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0443\u043b\u0443.<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"python\"># \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u0441\u0432\u0435\u0440\u0442\u043a\u0438 # \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435, \u043c\u043e\u0436\u043d\u043e \u0432 \u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c # \u0430 \u043c\u043e\u0436\u043d\u043e \u0438 \u0447\u0435\u0440\u0435\u0437 data.table  dt &lt;- copy(data) %>%   .[, .(y_mean = mean(y)), by = .(treat_time, time)]  # \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0442\u043a\u0443 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 #   (E[y|treat_time = x,t = t] - E[y|treat_time = x,t = treat_time-1])    - (E[y|treat_time = 0,t = t] - E[y|treat_time = 0,t = treat_time-1]) df &lt;- expand_grid(x = unique(dt$treat_time),                    t = unique(dt$time)) %>%   # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f \u0441\u043b\u0438\u044f\u043d\u0438\u044f   mutate(i1 = x, j1 = t, i2 = x, j2 = x - 1,           i3 = 0, j3 = t, i4 = 0, j4 = x - 1) %>%   # \u043d\u0430\u043d\u0438\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0435   left_join(dt[, .(i1 = treat_time, j1 = time, a = y_mean)]) %>%   left_join(dt[, .(i2 = treat_time, j2 = time, b = y_mean)]) %>%   left_join(dt[, .(i3 = treat_time, j3 = time, c = y_mean)]) %>%   left_join(dt[, .(i4 = treat_time, j4 = time, d = y_mean)]) %>%   mutate(var = (a - b) - (c - d))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432, \u043a\u043e\u0434 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u0435\u043d \u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0435\u043d.<\/p>\n<p>  <\/p>\n<h1 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<p>\u0417\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0439\u0442\u0435 \u0432 <a href=\"https:\/\/t.me\/rlang_ru\" rel=\"nofollow noopener noreferrer\">\u0433\u0440\u0443\u043f\u043f\u0443<\/a>, \u0437\u0430\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0430\u043c \u0434\u0430\u0436\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0431\u044b\u0432\u0430\u044e\u0442.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u2014 <a href=\"https:\/\/habr.com\/ru\/post\/659349\/\">\u00abData Science \u2014 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u043f\u0435\u043b\u044c\u043c\u0435\u043d\u0435\u0439\u2026\u00bb<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/664634\/\"> https:\/\/habr.com\/ru\/post\/664634\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/dd\/mh\/hz\/ddmhhzy8egyq4t1abitzpo8_cey.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/dd\/mh\/hz\/ddmhhzy8egyq4t1abitzpo8_cey.jpeg\" data-blurred=\"true\"\/><br \/>  <em>\u00abHow I Met Your Mother\u00bb, season 6, ep. 7<\/em><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041a\u043e\u043b\u044f \u043b\u044e\u0431\u0438\u0442 \u0446\u0438\u043a\u043b\u044b.  \u0422\u043e\u043b\u044f \u043b\u044e\u0431\u0438\u0442 \u0446\u0438\u043a\u043b\u044b.  \u041e\u043b\u044f \u043b\u044e\u0431\u0438\u0442 \u0446\u0438\u043a\u043b\u044b.  \u0412\u0441\u0435 \u043b\u044e\u0431\u044f\u0442 \u0446\u0438\u043a\u043b\u044b.   \u0418 \u0421\u0435\u0440\u0435\u0436\u0430 \u0442\u043e\u0436\u0435.<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0434\u0438\u043d \u041c\u0430\u043c\u0431\u0430 \u0438\u0445 \u043d\u0435 \u043b\u044e\u0431\u0438\u0442. \u0418 \u0432\u043e\u0442 \u043f\u043e\u0447\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0441\u043a\u0438\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0438\u043a\u043b\u043e\u043c \u0438\u043b\u0438 goto, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0440\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u044b:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0446\u0438\u043a\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443. \u041d\u043e \u0442\u0443\u0442 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b.<\/li>\n<li>\u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0446\u0438\u043a\u043b\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u2014 \u0441\u0438\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0441\u0430\u0434\u043a\u0430 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0410 \u0443 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 \u0435\u0449\u0435 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442 \u0446\u0438\u043a\u043b\u0430.<\/li>\n<li>\u041d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0446\u0438\u043a\u043b\u0430 (<code>break<\/code>, <code>continue<\/code>) \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u0410 \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0446\u0438\u043a\u043b \u043f\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044f\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u043d\u043e. \u0412 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b. \u0415\u0441\u043b\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u2014 \u043d\u0430\u0434\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u044f\u0432\u043d\u043e.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 <a href=\"https:\/\/habrahabr.ru\/users\/i_shutov\/posts\/\" rel=\"nofollow noopener noreferrer\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/a>.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-332870","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/332870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=332870"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/332870\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=332870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=332870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=332870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}