Nano Hash - криптовалюты, майнинг, программирование

Сложная группа обработкой в ​​data.table

Приносим извинения за нечеткое описание, но я не думаю, что однострочный текст может объяснить мое требование.

У меня есть таблица данных dt1, как показано ниже:

      id  pg   pd                  dt capp vt
 1: 1111  hm <NA> 20-10-2020 21:07:54   NA  5
 2: 1111 abc  abc 20-10-2020 21:07:53 1234  5
 3: 1111  hm <NA> 20-10-2020 16:07:56   NA  4
 4: 1111 cde <NA> 20-10-2020 16:06:57   NA  4
 5: 1111 cde <NA> 20-10-2020 16:05:58   NA  4
 6: 1111 def  def 20-07-2020 12:07:59  345  3
 7: 1111 abc <NA> 20-06-2020 22:07:59   NA  2
 8: 1111 def <NA> 20-06-2020 22:07:58   NA  2
 9: 1111 abc <NA> 20-05-2020 21:07:59   NA  1
10: 1112  hm <NA> 20-10-2020 21:07:52   NA  4
11: 1112 cde  cde 20-10-2020 21:07:39  456  4
12: 1112  hm <NA> 20-10-2020 16:07:56   NA  3
13: 1112 abc <NA> 20-10-2020 16:06:57   NA  3
14: 1112 abc <NA> 20-07-2020 16:05:58   NA  2
15: 1112 def  abc 20-07-2020 16:04:59  234  2
16: 1112 cde <NA> 20-06-2020 22:07:59   NA  1
17: 1112 def <NA> 20-06-2020 21:07:59   NA  1
18: 1112 cde <NA> 20-05-2020 21:07:59   NA  0

Требование заключается в следующем: я хочу создать новую переменную prev, которая для заданных id и capp (где capp не null) равна max из vt, где:

vt меньше значения vt, соответствующего ненулевому capp

и

pg равно значению в pd, соответствующему ненулевому capp

Мой ожидаемый результат будет выглядеть так:

      id  pg   pd                  dt capp vt   prev
 1: 1111  hm <NA> 20-10-2020 21:07:54   NA  5   <NA>
 2: 1111 abc  abc 20-10-2020 21:07:53 1234  5      2
 3: 1111  hm <NA> 20-10-2020 16:07:56   NA  4   <NA>
 4: 1111 cde <NA> 20-10-2020 16:06:57   NA  4   <NA>
 5: 1111 cde <NA> 20-10-2020 16:05:58   NA  4   <NA>
 6: 1111 def  def 20-07-2020 12:07:59  345  3      2
 7: 1111 abc <NA> 20-06-2020 22:07:59   NA  2   <NA>
 8: 1111 def <NA> 20-06-2020 22:07:58   NA  2   <NA>
 9: 1111 abc <NA> 20-05-2020 21:07:59   NA  1   <NA>
10: 1112  hm <NA> 20-10-2020 21:07:52   NA  4   <NA>
11: 1112 cde  cde 20-10-2020 21:07:39  456  4      1
12: 1112  hm <NA> 20-10-2020 16:07:56   NA  3   <NA>
13: 1112 abc <NA> 20-10-2020 16:06:57   NA  3   <NA>
14: 1112 abc <NA> 20-07-2020 16:05:58   NA  2   <NA>
15: 1112 def  abc 20-07-2020 16:04:59  234  2 NA/Inf
16: 1112 cde <NA> 20-06-2020 22:07:59   NA  1   <NA>
17: 1112 def <NA> 20-06-2020 21:07:59   NA  1   <NA>
18: 1112 cde <NA> 20-05-2020 21:07:59   NA  0   <NA>

dt1 определение приведено ниже:

structure(list(id = c(1111L, 1111L, 1111L, 1111L, 1111L, 1111L, 
1111L, 1111L, 1111L, 1112L, 1112L, 1112L, 1112L, 1112L, 1112L, 
1112L, 1112L, 1112L), pg = c("hm", "abc", "hm", "cde", "cde", 
"def", "abc", "def", "abc", "hm", "cde", "hm", "abc", "abc", 
"def", "cde", "def", "cde"), pd = c(NA, "abc", NA, NA, NA, "def", 
NA, NA, NA, NA, "cde", NA, NA, NA, "abc", NA, NA, NA), dt = c("20-10-2020 21:07:54", 
"20-10-2020 21:07:53", "20-10-2020 16:07:56", "20-10-2020 16:06:57", 
"20-10-2020 16:05:58", "20-07-2020 12:07:59", "20-06-2020 22:07:59", 
"20-06-2020 22:07:58", "20-05-2020 21:07:59", "20-10-2020 21:07:52", 
"20-10-2020 21:07:39", "20-10-2020 16:07:56", "20-10-2020 16:06:57", 
"20-07-2020 16:05:58", "20-07-2020 16:04:59", "20-06-2020 22:07:59", 
"20-06-2020 21:07:59", "20-05-2020 21:07:59"), capp = c(NA, 1234L, 
NA, NA, NA, 345L, NA, NA, NA, NA, 456L, NA, NA, NA, 234L, NA, 
NA, NA), vt = c(5L, 5L, 4L, 4L, 4L, 3L, 2L, 2L, 1L, 4L, 4L, 3L, 
3L, 2L, 2L, 1L, 1L, 0L)), .Names = c("id", "pg", "pd", "dt", 
"capp", "vt"), row.names = c(NA, -18L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x0000000002650788>)
20.10.2020

  • Насколько я могу судить, вы никогда не рассматриваете строки, в которых capp равно NA, а все значения в prev берутся из столбца vt. Тогда как вы можете получить 2 во второй строке prev, поскольку capp всегда NA, когда vt равно 2 для id = 1111? 20.10.2020
  • @ekoam: Я понял, откуда ты. vt меньше значения vt, соответствующего ненулевому capp, на самом деле я ищу значения vt (где capp может быть нулевым), но меньше значения vt из строки, где capp не равно NULL (ergo соответствует ненулевому capp) 20.10.2020

Ответы:


1

Вот еще один вариант, использующий неэквивалентное соединение для каждой строки ненулевого capp и последующее обновление по ссылке:

dt1[!is.na(capp), prev := 
    dt1[.SD, on=.(id, pg=pd, vt<vt), max(x.vt), by=.EACHI]$V1
]
21.10.2020
  • Вы дали мне пережевывать корм. Спасибо за вашу помощь. 21.10.2020
  • Любопытно отметить, что если мне нужно добавить еще одно условие, например pg!="cc", войдет ли оно в on()? 21.10.2020
  • dt1[!is.na(capp), prev := dt1[.SD, on=.(id, pg=pd, vt<vt), max(x.vt[pg!="cc"]), by=.EACHI]$V1 ]. Это сработало для меня, но немного замедлило работу. 21.10.2020

  • 2

    Это то, что тебе надо?

    dt1[, 
      prev := with(.SD, vapply(
        seq_along(vt), 
        function(i) {tmp <- vt[vt < vt[[i]] & pg == pd[[i]] & !is.na(capp[[i]])]; if (length(tmp) < 1L) NA_real_ else max(tmp)}, 
        numeric(1L)
      )), 
      by = id
    ]
    

    Вывод

          id  pg   pd                  dt capp vt prev
     1: 1111  hm <NA> 20-10-2020 21:07:54   NA  5   NA
     2: 1111 abc  abc 20-10-2020 21:07:53 1234  5    2
     3: 1111  hm <NA> 20-10-2020 16:07:56   NA  4   NA
     4: 1111 cde <NA> 20-10-2020 16:06:57   NA  4   NA
     5: 1111 cde <NA> 20-10-2020 16:05:58   NA  4   NA
     6: 1111 def  def 20-07-2020 12:07:59  345  3    2
     7: 1111 abc <NA> 20-06-2020 22:07:59   NA  2   NA
     8: 1111 def <NA> 20-06-2020 22:07:58   NA  2   NA
     9: 1111 abc <NA> 20-05-2020 21:07:59   NA  1   NA
    10: 1112  hm <NA> 20-10-2020 21:07:52   NA  4   NA
    11: 1112 cde  cde 20-10-2020 21:07:39  456  4    1
    12: 1112  hm <NA> 20-10-2020 16:07:56   NA  3   NA
    13: 1112 abc <NA> 20-10-2020 16:06:57   NA  3   NA
    14: 1112 abc <NA> 20-07-2020 16:05:58   NA  2   NA
    15: 1112 def  abc 20-07-2020 16:04:59  234  2   NA
    16: 1112 cde <NA> 20-06-2020 22:07:59   NA  1   NA
    17: 1112 def <NA> 20-06-2020 21:07:59   NA  1   NA
    18: 1112 cde <NA> 20-05-2020 21:07:59   NA  0   NA
    
    20.10.2020
  • Это работает, но очень медленно. Спасибо за вашу помощь. 21.10.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..