Quelles sont les différences entre les types de données vectorielles et liste dans R?

127

Quelles sont les principales différences entre les types de données vectorielles et liste dans R? Quels sont les avantages ou les inconvénients d'utiliser (ou non) ces deux types de données?

J'apprécierais de voir des exemples qui illustrent les cas d'utilisation des types de données.

DCR
la source

Réponses:

77

Techniquement, les listes sont des vecteurs, bien que très peu utilisent ce terme. "liste" est l'un des nombreux modes, les autres étant "logique", "caractère", "numérique", "entier". Ce que vous appelez des vecteurs sont des "vecteurs atomiques" dans le langage strict de R:

 aaa <- vector("list", 3)
 is.list(aaa)   #TRUE
 is.vector(aaa)  #TRUE

Les listes sont de type "récursif" (de vecteur) alors que les vecteurs atomiques ne le sont pas:

is.recursive(aaa)  # TRUE
is.atomic(aaa)  # FALSE

Vous traitez des objets de données avec des fonctions différentes selon qu'ils sont récursifs, atomiques ou ont des attributs dimensionnels (matrices et tableaux). Cependant, je ne suis pas sûr qu'une discussion sur les «avantages et inconvénients» des différentes structures de données soit une question suffisamment ciblée pour SO. Pour ajouter à ce que Tommy a dit, en plus des listes capables de contenir un nombre arbitraire d'autres vecteurs, il y a la disponibilité de dataframes qui sont un type particulier de liste qui a un attribut dimensionnel qui définit sa structure. Contrairement aux matrices et aux tableaux qui sont des objets atomiques vraiment pliés, les dataframes peuvent contenir différents types, y compris des types de facteurs.

Il y a aussi la mise en garde que la is.vectorfonction retournera FALSElorsqu'il y aura des attributs autres que des noms. Voir: qu'est-ce que le vecteur?

IRTFM
la source
54

Les listes sont "récursives". Cela signifie qu'ils peuvent contenir des valeurs de différents types, voire d'autres listes:

x <- list(values=sin(1:3), ids=letters[1:3], sub=list(foo=42,bar=13))
x # print the list
x$values   # Get one element
x[["ids"]] # Another way to get an element
x$sub$foo  # Get sub elements
x[[c(3,2)]]  # Another way (gets 13)
str(x)     # A "summary" of the list's content

Les listes sont utilisées dans R pour représenter des ensembles de données: la data.frameclasse est essentiellement une liste où chaque élément est une colonne d'un type spécifique.

Une autre utilisation est lors de la représentation d'un modèle: le résultat de lmrenvoie une liste qui contient un tas d'objets utiles.

d <- data.frame(a=11:13, b=21:23)
is.list(d) # TRUE
str(d)

m <- lm(a ~ b, data=d)
is.list(m) # TRUE
str(m)

Les vecteurs atomiques (non-listés, mais numériques, logiques et caractères) sont utiles car tous les éléments sont connus pour avoir le même type. Cela rend leur manipulation très rapide.

Tommy
la source
20

En tant que personne qui vient d'entrer dans R, mais qui vient d'un fond C / Java / Ruby / PHP / Python, voici comment j'y pense.

A listest vraiment un tableau + un hashmap. C'est un tableau associatif PHP.

> foo = list(bar='baz')
> foo[1]
'baz'
> foo$bar
'baz'
> foo[['bar']]
'baz'

A vectorest un tableau / une liste de type fixe. Pensez-y comme une liste chaînée - car mettre des éléments différents dans une liste chaînée est de toute façon un anti-modèle. C'est un vecteur dans le même sens que les unités SIMD / MMX / vectorielles utilisent le mot.

Andy V
la source
3
Vous pouvez avoir des keys dans des vecteurs en utilisant la namesméthode.
gokul_uf
9

Cette question et d'autres questions d'introduction similaires sont répondues dans http://www.burns-stat.com/pages/Tutor/hints_R_begin.html

Il s'agit d'une introduction douce qui vous permet de vous familiariser avec R le plus rapidement possible. Dans une certaine mesure, cela réussit.

--- Éditer: --

Une tentative d'expliquer davantage; cité à partir de la référence ci-dessus.

Vecteur atomique

Il existe trois variétés de vecteur atomique que vous êtes susceptible de rencontrer:

  • "Numérique"
  • "logique"
  • "personnage"

La chose à retenir à propos des vecteurs atomiques est que tous les éléments qu'ils contiennent ne sont que d'un seul type.

liste

Les listes peuvent avoir différents types d'éléments dans différents composants. Un composant d'une liste peut être une autre liste, un vecteur atomique (et d'autres choses).

Veuillez également vous référer à ce lien.

Patrick Burns
la source
2
Downvoté: vous devez au moins nous indiquer la section spécifique de ce site Web qui répond à la question initiale.
nbro
2

liste comprend plusieurs types de données comme caractère, numérique, logique et. mais le vecteur ne contient que des types de données similaires. par ex:

scores <- c(20,30,40,50)
student <- c("A","B","C","D")
sc_log <- c(TRUE,FALSE,FALSE,TRUE)

pour la liste:

mylist <- list(scores,student,sc_log)
# search for class of mylist vector 
#check structure of mylist using str() function.
str(mylist)
[1] list of 3
[1] $:num [1:4] 20 30 40 50
[2] $:chr [1:4] "A""B""C""D"
[3] $:log [1:4] TRUE FALSE FALSE TRUE

ce qui signifie une liste contenant plusieurs types de données comme numérique, caractère et logique dans mylist.Mais dans le vecteur, il y aura un seul type de données de tous les éléments de ce vecteur

par ex:

pour le vecteur:

vector1 <- c(1,2,3,4)
Class(vector1)
[1] "Numeric"

#which means all elements of vector containing single data type that is numeric only.
Devyani Balyan
la source