Considérez les éléments suivants:
5000 6000 5500 5000 5300
4 Réponses :
Considérez un compte conditionnel en cours avec Sapply () code>. Bien que cela soit toujours une boucle, il s'agit d'une méthode vectorisée: count_above <- sapply(seq_len(nrow(df)),
function(i) sum(df[i:1, c("X")] < df$X[i]))
count_above
# [1] 0 1 1 0 2
Il devrait être df [(I-1): 1, c ("x")]
Pas nécessairement la ligne juste au-dessus de cela. Voir la troisième rangée de 5500 de SOP de 5500 Retours 1 puisqu'il regarde 5000 et 6000, les deux au-dessus de celle-ci (toutes les valeurs ci-dessus).
Je veux dire que vous devriez comparer toutes les lignes au-dessus de moi avec moi, ce qui signifie V [1: (I-1)] et V [i]. Y compris, je n'ai pas eu d'erreur que parce que comparer V [i]
Une autre approche (toujours une boucle à cause de Cela ne sera probablement pas aussi efficace que la réponse de Parfait, mais c'est une alternative. p> p> colsums code>):
Une autre approche, assez similaire à la solution d'Aichao (mais un peu plus courte) edit (performance): strong> J'avais peut-être que mon idée a été sélectionnée comme une réponse acceptée parce que C'est un code court et auto-expliquant - mais faites attention à l'utiliser sur de grands vecteurs! C'est l'approche la plus lente de toutes les solutions suggérées ici! Semblable à celle de ce que Dracodoc a fait, j'ai aussi fait un microbenchmark. Mais j'ai utilisé un vecteur généré aléatoire de 3000 valeurs pour obtenir des heures d'exécution plus significatives: p> Nous voyons que l'approche appliquée sur un grand vecteur et sans la surcharge d'un cadre de données est légèrement plus rapide que la boucle pour la boucle. p> Mon approche de produit externe prend plus que le double du temps. P> Je recommanderais donc d'utiliser la boucle - c'est aussi lisible et plus rapide . Mon approche pourrait être envisagée si vous souhaitez avoir un code correct prouvable (car cette doublure est assez proche d'une spécification du problème) p> p>
Merci pour la mise à jour. Je devrais aussi utiliser un ensemble de données aléatoires plus grandes. La taille de la petite taille que j'ai utilisée rendez la référence que j'ai faite moins informative.
Edit: Je devrais utiliser un ensemble de données plus grand pour référence, le minuscule ensemble de données rend les résultats de référence un peu trompeurs. Voir la mise à jour de Patrickroocks.
Je viens de faire remarquer que pour la boucle n'est pas nécessairement mauvaise que d'appliquer une famille, je l'ai vu. P>
J'ai fait une microbenchmark comparant une optimisation pour la boucle et la méthode Sapply. pour la boucle est 6 fois plus rapide. La méthode SAPPLY n'est pas une fonction appropriée, la modifiant dans une fonction prenant un vecteur au lieu de supposer que les colonnes de cadre de données pourraient améliorer un peu. P> mise à jour: p> count_above <- function(v)
{
counts <- integer(length = length(v))
for (i in 1:length(v))
{
counts[i] <- sum(v[1:(i-1)] < v[i])
}
return(counts)
}
Habituellement, vous voulez éviter de boucle et d'utiliser la fonction vectorielle à la place. Cependant, dans ce cas pour chaque ligne, vous devez comparer les valeurs I-1, et je ne pense pas que cela puisse être beaucoup vectorisé. Parfois, il suffit de garder la boucle est ok. Enveloppez-le avec Apply Family May Lisability de danger réel.
Plusieurs points de vos fonctions peuvent être améliorés cependant: 1. Créez le vecteur de comptes avec une taille fixe au lieu de l'augmenter à chaque étape. 2. Pas besoin de créer temp, utilisez simplement le vecteur [1: I] en place. 3. N'utilisez pas le nom réservé comme variable, comme le paramètre
Vecteur code>. 4. Il devrait être vecteur [1: (i-1)]