Извлечение значений из фрейма данных путем поднабора на основе текущей даты и предыдущей даты - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть следующий набор данных, который описывает общее количество часов тренировок, завершенных каждую неделю, со ссылкой на дату окончания недели. Недели с понедельника по воскресенье, поэтому даты WeekEnding с интервалом в 7 дней.

df<- structure(list(WeekEnding = c("2020-03-08", "2020-03-15", "2020-03-22", 
"2020-03-29", "2020-04-05", "2020-04-12", "2020-04-19", "2020-04-26"
), TotalTraining.hrs = c(14.119574637, 15.560762437, 14.160377084, 
16.968056203, 14.617250934, 10.865982397, 14.619121779, 13.135129677
)), row.names = c(NA, 8L), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"))

Эти данные будут обновляться каждую неделю. Я хотел бы иметь возможность сравнить общее количество часов обучения за последнюю неделю с предыдущей неделей. Я могу легко получить общее количество часов тренировок за последнюю неделю (т.е. максимальную неделю).

df$TotalTraining.hrs[df$WeekEnding == max(df$WeekEnding)]
[1] 13.13513

И я могу вручную ввести дату для получения предыдущей недели

> df$TotalTraining.hrs[df$WeekEnding == "2020-04-19"]
[1] 14.61912

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

> df$TotalTraining.hrs[df$WeekEnding == (max(df$WeekEnding)- 7)]
Error in max(df$WeekEnding) - 7 : non-numeric argument to binary operator

Есть ли решение для этого? Спасибо

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

Если заказано, последний -

 df[length(df),]

и предыдущий

 df[length(df)-1,]
0 голосов
/ 29 апреля 2020

Вы можете использовать which.max, который указывает индекс значения max и вычитать 1 из него:

diff <- df$TotalTraining.hrs[df$WeekEnding == max(df$WeekEnding)] - df$TotalTraining.hrs[which.max(df$WeekEnding) -1]

Результат:

diff
[1] -1.483992

(Это решение требует, чтобы df был заказан WeekEnding.)

0 голосов
/ 29 апреля 2020

Если ваши данные уже упорядочены, вы можете выбрать две последние строки и вычесть их с помощью diff.

diff(tail(df, 2)$TotalTraining.hrs)
#[1] -1.483992

Если он не заказан, вы можете сначала заказать его

df$WeekEnding <- as.Date(df$WeekEnding)
df <- df[order(df$WeekEnding),]

Чтобы рассчитать процентное изменение, мы можем сделать:

x <- tail(f, 2)$TotalTraining.hrs
diff(x)/x[1] * 100
#[1] -10.15103
...