J'essaie d'obtenir la ligne exacte où $ last_200_low code> change de colonne et 3 rangées derrière a la même valeur de la ligne réelle. J'ai 2 erreurs différentes et une solution qui stimule presque le problème. Tous les conseils? if (diff(df$last_200_low[i]) != 0 & df$last_200_low[i] == df$last_200_low[i - 3]) {
print(df[i])
i <- i + 1
}
Error in if (diff(df$last_200_low[i]) != 0 & df$last_200_low[i] == :
argument is of length zero
4 Réponses :
Pour obtenir un vecteur égal à la longueur de votre Le problème avec le second est quelque peu similaire. data.frame.frame code>, vous pouvez combiner avec un problème logique: DF [I-3,] Code> évaluera à DF [-2,] code> ce que vous voulez. Voir le retour: P> DF <- data.frame(ID = 4070:4077, last_200_low = c(rep(3200.5,4), 3200.0, 3199.5, 3199.0, 3198.5))
n_lag <- 3
DF[c(diff(DF$last_200_low) !=0, FALSE)
& c(rep(FALSE, n_lag), diff(DF$last_200_low, lag = n_lag) == 0)
, ]
ID last_200_low
4 4073 3200.5
a mal interprété la question, alors modifiant pour montrer la dernière des valeurs correspondantes comme demandé. p>
échantillon Data: p>
df <- structure(list(data_hora = structure(c(1L, 1L, 1L, 2L, 3L), .Label = c("2018-02-01 09:39:20",
"2018-02-01 09:39:23", "2018-02-01 09:39:24"), class = "factor"),
last_200_low = c(3200.5, 3200.5, 3200.5, 3200, 3199.5)), class = "data.frame", row.names = c(NA,
-5L))
Vous pouvez obtenir ce que vous voulez à l'aide de données.Table et la fonction de décalage: code simple et en ligne!
J'espère que cela aide! P> p>
Utilisation de données.Table:
library('data.table')
func <- function(dt) unique(dt[, .(N = .N), by = data_hora][N >= 3]$data_hora)
dt[c(diff(last_200_low),0) != 0 & data_hora %in% func(dt)]
Juste pour référence, des itérations de boucle de style C ne sont pas nécessaires (n'ont pas besoin de déclarer «i» ni 'i = i + 1')