Je ne peux pas insister davantage sur la différence d'efficacité entre les deux ! S'il est vrai que les DF sont plus pratiques dans certains cas, en particulier pour l'analyse des données, qu'ils permettent également l'utilisation de données hétérogènes et que certaines bibliothèques les acceptent uniquement, tout cela est vraiment secondaire, sauf si vous écrivez un code unique pour une tâche spécifique.
Laissez-moi vous donner un exemple. Il y avait une fonction qui calculait le chemin 2D de la méthode MCMC. En gros, cela signifie que nous prenons un point initial (x,y), et que nous itérons un certain algorithme pour trouver un nouveau point (x,y) à chaque étape, en construisant de cette façon le chemin complet. L'algorithme implique le calcul d'une fonction assez complexe et la génération d'une certaine variable aléatoire à chaque itération, donc quand il a fonctionné pendant 12 secondes, j'ai pensé que c'était bien étant donné la quantité de choses qu'il fait à chaque étape. Ceci étant dit, la fonction a rassemblé tous les points du chemin construit ainsi que la valeur d'une fonction objective dans un data.frame à 3 colonnes. Ainsi, 3 colonnes n'est pas si grand, et le nombre d'étapes était également plus que raisonnable 10.000 (dans ce genre de problèmes les chemins de longueur 1.000.000 sont typiques, donc 10.000 n'est rien). J'ai donc pensé qu'un DF de 10 000x3 n'était absolument pas un problème. La raison pour laquelle un DF a été utilisé est simple. Après avoir appelé la fonction, ggplot() a été appelé pour dessiner le chemin (x,y) résultant. Et ggplot() n'accepte pas de matrice.
Puis, à un moment donné, par curiosité, j'ai décidé de modifier la fonction pour rassembler le chemin dans une matrice. Heureusement la syntaxe des DFs et des matrices est similaire, tout ce que j'ai fait c'est de changer la ligne spécifiant df comme un data.frame par une ligne l'initialisant comme une matrice. Ici, je dois également mentionner que dans le code initial, le DF a été initialisé pour avoir la taille finale, de sorte que plus tard dans le code de la fonction, seules les nouvelles valeurs ont été enregistrées dans les espaces déjà alloués, et il n'y avait pas de frais généraux pour ajouter de nouvelles lignes au DF. Cela rend la comparaison encore plus équitable, et cela a également simplifié mon travail, car je n'ai pas eu besoin de réécrire quoi que ce soit d'autre dans la fonction. Une seule ligne a été modifiée pour passer de l'allocation initiale d'un data.frame de la taille requise à une matrice de la même taille. Pour adapter la nouvelle version de la fonction à ggplot(), j'ai converti la matrice maintenant retournée en un data.frame à utiliser dans ggplot().
Après avoir réexécuté le code, je ne pouvais pas croire le résultat. Le code a été exécuté en une fraction de seconde ! Au lieu d'environ 12 secondes. Et encore, la fonction pendant les 10.000 itérations n'a fait que lire et écrire des valeurs dans des espaces déjà alloués dans un DF (et maintenant dans une matrice). Et cette différence est aussi pour la taille raisonnable (ou plutôt petite) 10000x3.
Ainsi, si votre seule raison d'utiliser un DF est de le rendre compatible avec une fonction de bibliothèque telle que ggplot(), vous pouvez toujours le convertir en DF au dernier moment - et travailler avec des matrices aussi loin que vous le souhaitez. Si, d'un autre côté, vous avez une raison plus importante d'utiliser un DF, par exemple si vous utilisez un paquet d'analyse de données qui nécessiterait une transformation constante des matrices en DF et vice-versa, ou si vous ne faites pas de calculs intensifs vous-même et n'utilisez que des paquets standard (beaucoup d'entre eux transforment en interne un DF en matrice, font leur travail, puis retransforment le résultat - ils font donc tout le travail d'efficacité pour vous), ou si vous faites un travail unique pour ne pas vous soucier et vous sentir plus à l'aise avec les DF, alors vous ne devriez pas vous soucier de l'efficacité.
Ou une autre règle plus pratique : si vous avez une question comme dans l'OP, utilisez les matrices, alors vous n'utiliserez les DF que lorsque vous n'avez pas une telle question (parce que vous savez déjà que vous devez utiliser les DF, ou parce que vous ne vous en souciez pas vraiment puisque le code est unique, etc.)
Mais en général, gardez toujours à l'esprit ce point d'efficacité comme une priorité.
0 votes
Souvent, une matrice peut être mieux adaptée à un type particulier de données, mais si le paquet que vous voulez utiliser pour analyser ladite matrice s'attend à un cadre de données, vous devrez toujours le convertir inutilement. Je pense qu'il n'y a aucun moyen d'éviter de se souvenir de quel paquet utilise quel paquet.