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

Как правильно использовать функцию slice

Я хотел использовать фрагмент, и этот пример здесь оказался наиболее подходящим. Однако, когда я попробовал это для своих данных, это не сработало, но я не уверен, что мне не хватает.

Данные

library(tidyverse)
library(lubridate)


# Data
my_df <- structure(list(Date = structure(c(17896, 17986, 18077, 18160), class = "Date"), 
                        t_period = c("Quarter", "Quarter", "Quarter", "Quarter"), 
                        A = c(-10.2, 9.4, 3.2, 0.7), B = c(-13.6, 13.4, 6.2, 2.8)), class = c("grouped_df", 
                                                                                              "tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L), groups = structure(list(
                                                                                                Date = structure(c(17896, 17986, 18077, 18160), class = "Date"), 
                                                                                                .rows = list(1L, 2L, 3L, 4L)), row.names = c(NA, -4L), class = c("tbl_df", 
                                                                                                                                                                 "tbl", "data.frame"), .drop = TRUE))


# my_df
# A tibble: 4 x 4
# Groups:   Date [4]
#  Date       t_period     A     B
#  <date>     <chr>    <dbl> <dbl>
#1 2018-12-31 Quarter  -10.2 -13.6
#2 2019-03-31 Quarter    9.4  13.4
#3 2019-06-30 Quarter    3.2   6.2
#4 2019-09-21 Quarter    0.7   2.8

Что я хочу сделать, так это отфильтровать дату последнего квартала, если она до конца квартала.

# Get end of existing quarter
end_of_qtr <- ceiling_date(as.Date("2019-09-28"), "quarter") - 1

# Filter out last row if Date < quarter end date
filtered_df <- my_df %>%
  group_by(t_period) %>%
  arrange(Date) %>%
  slice(ifelse( n() < end_of_qtr, 1:(n()-1), n() ))

Однако это не возвращает желаемый результат, который будет первыми 3 строками my_data с последней даты («2019-09-21» предшествует дате end_of_qtr «2019-09-30»)

Может ли кто-нибудь сказать мне, как правильно использовать slice для этого, пожалуйста?

13.10.2019

  • В данном случае slice(if(Date[n()] < end_of_qtr) -n() else 1:n()), но вам потребуется логика для определения последней даты каждого квартала, если вы хотите работать с данными за несколько кварталов. 13.10.2019
  • Возможно, я неправильно понимаю вопрос, но это кажется проще без среза: my_df %>% mutate(qtr_end = ceiling_date(Date, "quarter") - 1) %>% filter(Date == qtr_end | Date != last(Date)) Сюда входят все непоследние строки, а также последняя, ​​если она находится в конце четверти. 13.10.2019
  • Я знал, что упускаю что-то простое. Спасибо eipi10, это работает. Я знаю, что -n() работает в состоянии True, но почему 1:n() -1 не работает? 13.10.2019
  • Спасибо, Джон, я согласен, что это тоже работает. Я просто пытался понять, почему я не мог заставить слайс работать. 13.10.2019
  • Ваш код сравнивает n() с end_of_qtr, а не сравнивает значение Date с end_of_qtr. Это та часть, которая не работала. 13.10.2019
  • Да, я имел в виду, использую ли я slice(ifelse( Date[n()] < end_of_qtr, 1:(n() -1), n() )) вместо использования slice(ifelse( Date[n()] < end_of_qtr, -n(), n() )) 13.10.2019
  • Я думаю, это потому, что ifelse векторизован, поэтому он работает с каждой строкой группы отдельно, тогда как if работает с группой в целом. Это сработает: slice(if(Date[n()] < end_of_qtr) 1:(n()-1) else 1:n()). 13.10.2019
  • Большое спасибо. Я рад принять ваш ответ, если вы хотите опубликовать его. 13.10.2019

Новые материалы

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

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

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

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

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

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

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