web-dev-qa-db-fra.com

Quelle est la différence entre dataframe et list dans R?

Quelle est la différence entre dataframe et list in R? Lequel devrait être utilisé quand? Lequel est le plus facile à boucler?

Problème exact: Je dois d'abord stocker 3 éléments de chaîne tels que "a", "b", "c". Plus tard, pour chacun d’eux, je dois ajouter 3 autres éléments; par exemple, pour "a", je dois ajouter "a1", "a2", "a3". Plus tard, je dois utiliser des boucles for imbriquées pour accéder à ces éléments. 

Donc, je suis confus d'utiliser dataframe ou liste ou un autre type de données, dans lequel je pourrais d'abord stocker puis ajouter (type de chaque colonne)? 

Je reçois actuellement des erreurs du type "le nombre d'éléments à remplacer n'est pas un multiple de la longueur de remplacement"

63
ShazSimple

La question n’est pas aussi stupide que certains le pensent. Je connais beaucoup de gens qui luttent avec cette différence et ce qu'il faut utiliser où. Résumer :

Les listes constituent de loin la structure de données la plus flexible de R. Elles peuvent être considérées comme un ensemble d’éléments sans aucune restriction quant à la classe, la longueur ou la structure de chaque élément. La seule chose dont vous devez vous occuper est que vous ne donnez pas le même nom à deux éléments. Cela pourrait causer beaucoup de confusion, et R ne donne pas d'erreur pour cela:

> X <- list(a=1,b=2,a=3)
> X$a
[1] 1

Les trames de données sont aussi des listes, mais elles ont quelques restrictions:

  • vous ne pouvez pas utiliser le même nom pour deux variables différentes
  • tous les éléments d'une trame de données sont des vecteurs 
  • tous les éléments d'une trame de données ont une longueur égale.

En raison de ces restrictions et de la structure bidimensionnelle qui en résulte, les trames de données peuvent imiter certains comportements des matrices. Vous pouvez sélectionner des lignes et effectuer des opérations sur des lignes. Vous ne pouvez pas faire cela avec des listes, car une ligne n'est pas définie ici.

Tout cela implique que vous deviez utiliser un bloc de données pour tout jeu de données adapté à cette structure bidimensionnelle. Vous utilisez essentiellement des cadres de données pour tout jeu de données où une colonne coïncide avec une variable et une ligne coïncide avec une seule observation au sens large du mot. Pour toutes les autres structures, les listes sont la voie à suivre.

Notez que si vous voulez une structure imbriquée, vous devez utiliser des listes. Comme les éléments d'une liste peuvent être eux-mêmes des listes, vous pouvez créer des objets structurés très flexibles.

110
Joris Meys

Regardez l'exemple: Si vous utilisez apply au lieu de sapply pour obtenir la classe -

apply(iris,2,class) #  function elements are rows or columns
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
"character"  "character"  "character"  "character"  "character" 

sapply(iris,class) # function elements are variables
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
"numeric"    "numeric"    "numeric"    "numeric"     "factor" 
0
user5220347