Tengo el siguiente conjunto de datos que describe el total de horas de capacitación completadas cada semana, con referencia a la fecha en que terminó la semana. Las semanas son de lunes a domingo, por lo que las fechas WeekEnding tienen 7 días de diferencia.

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"))

Estos datos se actualizarán todas las semanas. Me gustaría poder comparar las horas totales de entrenamiento de la semana más reciente con la semana anterior. Puedo obtener fácilmente el total de horas de entrenamiento para la semana más reciente (es decir, la semana máxima).

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

Y puedo ingresar manualmente la fecha para obtener la semana anterior

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

Sin embargo, como los datos se actualizarán regularmente, me gustaría poder hacer referencia a la semana anterior de la semana más reciente sin tener que ingresar manualmente la fecha.

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

Hay una solución para esto ? Gracias

0
wattss 29 abr. 2020 a las 12:26

3 respuestas

La mejor respuesta

Si sus datos ya están ordenados, puede seleccionar las dos últimas filas y restar usando diff.

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

Si no está ordenada, puede ordenarlas primero.

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

Para calcular el cambio porcentual podemos hacer:

x <- tail(f, 2)$TotalTraining.hrs
diff(x)/x[1] * 100
#[1] -10.15103
0
Ronak Shah 29 abr. 2020 a las 10:00

Si se ordena, el último es

 df[length(df),]

Y la anterior

 df[length(df)-1,]
1
denis 29 abr. 2020 a las 09:45

Puede usar which.max, que indica el índice del valor max y restar 1 de él:

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

Resultado:

diff
[1] -1.483992

(Esta solución requiere que df se ordene por WeekEnding).

0
Chris Ruehlemann 29 abr. 2020 a las 10:27