В чем разница между векторными и списковыми типами данных в R?

127

Каковы основные различия между векторными и списковыми типами данных в R? Каковы преимущества или недостатки использования (или отсутствия) этих двух типов данных?

Я был бы признателен за примеры, демонстрирующие варианты использования типов данных.

DCR
источник

Ответы:

77

Технически списки являются векторами, хотя очень немногие используют этот термин. «список» - это один из нескольких режимов, другие - «логический», «символьный», «числовой», «целочисленный». То, что вы называете векторами, является «атомарными векторами» в строгом выражении R:

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

Списки являются «рекурсивным» типом (векторов), тогда как атомарные векторы - нет:

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

Вы обрабатываете объекты данных с различными функциями в зависимости от того, являются ли они рекурсивными, атомарными или имеют размерные атрибуты (матрицы и массивы). Однако я не уверен, что обсуждение «преимуществ и недостатков» различных структур данных является достаточно сфокусированным вопросом для SO. Чтобы добавить к тому, что сказал Томми, помимо списков, способных содержать произвольное количество других векторов, есть доступность фреймов данных, которые представляют собой особый тип списка, который имеет размерный атрибут, который определяет его структуру. В отличие от матриц и массивов, которые на самом деле представляют собой свернутые атомарные объекты, фреймы данных могут содержать различные типы, включая типы факторов.

Также есть предостережение, что is.vectorфункция будет возвращать, FALSEкогда есть атрибуты, отличные от имен. Смотрите: что такое вектор?

IRTFM
источник
54

Списки «рекурсивны». Это означает, что они могут содержать значения разных типов, даже другие списки:

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

Списки используются в R для представления наборов данных: data.frameкласс, по сути, представляет собой список, в котором каждый элемент является столбцом определенного типа.

Другое использование - при представлении модели: результат lmвозвращает список, содержащий множество полезных объектов.

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)

Атомарные векторы (не списковые, а числовые, логические и символьные) полезны, поскольку известно, что все элементы имеют один и тот же тип. Это позволяет очень быстро управлять ими.

Томми
источник
20

Как человек, который только что освоил R, но имеет опыт работы с C / Java / Ruby / PHP / Python, вот что я думаю об этом.

A listдействительно массив + хэш-карта. Это ассоциативный массив PHP.

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

A vector- это массив / список фиксированного типа. Думайте об этом как о связанном списке, потому что размещение разнородных элементов в связанном списке в любом случае является анти-шаблоном. Это вектор в том же смысле, в котором это слово используется в модулях SIMD / MMX / vector.

Энди В
источник
3
Вы можете иметь keys в векторах, используя namesметод.
gokul_uf
9

Ответы на этот и аналогичные вводные вопросы можно найти на http://www.burns-stat.com/pages/Tutor/hints_R_begin.html.

Это должно быть мягкое введение, которое поможет вам как можно быстрее приступить к работе с R. В какой-то степени это удается.

--- Редактировать: --

Попытка объяснить дальше; цитируется из приведенной выше ссылки.

Атомный вектор

Вероятно, вы встретите три разновидности атомарного вектора:

  • «Числовой»
  • «Логическое»
  • "персонаж"

Об атомарных векторах следует помнить, что все элементы в них относятся только к одному типу.

Список

Списки могут содержать разные типы элементов в разных компонентах. Компонент списка может быть другим списком, атомарным вектором (и другими вещами).

Также перейдите по этой ссылке.

Патрик Бернс
источник
2
Проголосовали против: вы должны хотя бы указать нам на конкретный раздел этого веб-сайта, который отвечает на исходный вопрос.
nbro 08
2

список включает несколько типов данных, таких как символьные, числовые, логические и т. д. но вектор содержит только данные аналогичного типа. например:

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

для списка:

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

что означает список, содержащий несколько типов данных, таких как числовой, символьный и логический в mylist, но в векторе будет один тип данных для всех элементов в этом векторе

например:

для вектора:

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

#which means all elements of vector containing single data type that is numeric only.
Девяни Балян
источник