Comment gérer vide dataframes dans R?
J'ai remarqué que, parfois, j'ai des erreurs dans mon R scripts quand j'oublie de vérifier si le dataframe je suis en train de travailler sur est réellement vide (aucune ligne).
Par exemple, lorsque j'ai utilisé appliquent comme ce
apply(X=DF,MARGIN=1,FUN=function(row) !any(vec[ row[["start"]]:row[["end"]] ]))
et DF
qui est arrivé à être vide, j'ai eu une erreur sur les indices.
Pourquoi est-ce? Ne sont pas vides dataframes valide? Pourquoi ne apply()
avec MARGIN=1
même essayer de faire quoi que ce soit quand il n'y a pas de lignes dans le dataframe? Ai-je vraiment besoin d'ajouter une condition avant chaque appliquer pour s'assurer que le dataframe n'est pas vide?
Merci!
plyr
?Ce que vous voulez comme un résultat en cas de vide
data.frame
? Une liste? NULL
? NA
? FALSE
? Peut-être que vous pourriez éliminer les vides data.frame
's plus tôt dans votre code?Je ne suis pas sûr. Lorsque j'utilise
apply()
avec MARGIN=1
, exactement comment ça marche? J'ai pensé qu'il envoie chaque ligne de FUN
et d'agréger les résultats.Désolé, ce commentaire était stupide. Les ignorer.
OriginalL'auteur David B | 2010-09-07
Vous devez vous connecter pour publier un commentaire.
Sur une note de côté: appliquer toujours accède à la fonction que vous utilisez au moins une fois. Si l'entrée est un dataframe, sans lignes, mais avec les variables définies, il envoie des "FAUX" comme argument à la fonction. Si le dataframe est complètement vide, il envoie une logique(0) de la fonction.
De sorte que Joshua déjà dit, le contrôle avant de l'appliquer si le dataframe a des lignes, ou ajouter une condition dans la fonction au sein de l'appliquer.
EDIT :
Cela signifie que vous devez prendre en compte le fait que la longueur(x)==0 n'est pas une très bonne case, vous devez vérifier si soit la longueur(x==0) ou de !x est VRAI si les deux possibilités peuvent se présenter :
(Code de Josué)
if(length(row)==0 || !row)
(||
au lieu de|
), sinon, on pourrait obtenir des avertissements disantthe condition has length > 1 and only the first element will be used
Très vrai! Merci pour la correction
p.s. où est-ce que le comportement de
apply
que vous avez mentionnés sont-ils documentés?dans le code ci-dessus. Parfois de le tester vous-même vous donne déjà un aperçu de beaucoup de. Je me suis souvenu que je l'ai essayé il y a longtemps.
"S'appliquent toujours accède à la fonction que vous utilisez au moins une fois" - merci pour cette remarque. C'est que documenté quelque part? Le comportement de vraiment m'a jeté pour une boucle malgré avoir lu la doc de la fonction. Comment j'ai connu cela n'est que si ce n'est pour cette réponse? Merci!
OriginalL'auteur Joris Meys
Cela n'a absolument rien à voir avec
apply
. La fonction que vous utilisez l'application ne fonctionne pas lorsque les données.le cadre est vide.Ajouter une condition à votre fonction.
apply(MARGIN=1)
œuvres. J'ai supposé que c'envoyer chaque ligne deFUN
et agrège les résultats. Si c'était le cas, un vide de la trame de données ne devrait pas avoir manqué depuisFUN
n'aurait jamais été appelé. Donc je suppose que ce n'est pas le cas. J'ai regardé la documentation, mais n'a toujours pas à comprendre comment cela fonctionne exactement.apply
ne pas l'agrégation. Il met les résultats des appels àFUN
sur des portions (les"marges") deX
dans un objet. L'objet résultant est défini dans le premier paragraphe de la "Valeur" de la section de?apply
. Je ne suis pas sûr de savoir pourquoi vous supposéFUN
ne serait pas appelé siX
est vide; la documentation n'est même pas allusion à ce comportement.Je sais que c'est un vieux de la réponse, mais ce qui arrive quand le bloc de données n'est pas vide, mais contiennent des valeurs. Je crois que si vous mettez un bloc de données avec plusieurs lignes dans cette fonction, il va cracher une erreur
OriginalL'auteur Joshua Ulrich
Je ne pense pas que c'est lié à 0-ligne de données.cadre:
Essayez d'utiliser
traceback()
après une erreur de voir exactement ce que sont la cause.OriginalL'auteur Marek
Je voudrais utiliser mapply à la place:
OriginalL'auteur datanalytics.com