La bonne façon de faire une boucle sur la longueur d'un dataframe dans la R
Après un peu de débogage aujourd'hui, à mon grand désarroi, j'ai trouvé que:
for (i in 1:0) {
print(i)
}
Réellement imprime 1 et 0 respectivement, dans R. Le problème est venu lors de l'écriture de
for (i in 1:nrow(myframe) {
fn(i)
}
Qui j'avais l'intention de ne pas exécuter si nrow(myframe)==0. Est la correction juste:
if (nrow(myvect) != 0) {
for (i in 1:nrow(myframe) {
fn(i)
}
}
Ou est-il un plus bonne façon de faire ce que je voulais dans la R?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
seq_along
à la place:Modifier après l'OP de mise à jour
Pour les vecteurs, il est
seq_along
, pour DataFrames vous pouvez utiliserseq_len
Concernant la modification, consultez la contrepartie de la fonction
seq_len(NROW(myframe))
. Cette utilisation est exactement la raison pour laquelle vous n'utilisez pas1:N
dans unfor()
boucle, encas, quelle que soit la valeur finit par remplacerN
est 0 ou négatif.Une alternative (qui vient se cache la boucle) est de faire
apply(myframe, 1, FUN = foo)
oùfoo
est une fonction contenant les choses que vous voulez faire pour chaque ligne demyframe
et sera probablement juste être couper et coller dans le corps de la boucle.Je pense que la plus bonne façon dans R est l'utilisation d'une
apply
fonction. Plus souvent que pas, il y a unapply
fonction qui le fait. Et plus souvent que pas, vous n'avez pas besoin d'une séquence.Voici un exemple qui s'applique
diff
pour chaque colonne, chaque rangée.sur les colonnes,
à travers les lignes,
sur les colonnes de nouveau, de retour d'une matrice
Voir ce lien pour une excellente explication sur
apply
Clairement toutes les réponses précédentes pour faire le travail.
Je voudrais avoir quelque chose comme ceci:
et puis
Totalement singulière réponse, c'est juste un wrapper.
Mais je pense que c'est plus lisible et intuitive.