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

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

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

Ответ 1

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

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

Списки представляют собой "рекурсивный" тип, тогда как атомные векторы не являются:

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

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

Ответ 2

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

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 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)

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

Ответ 3

Как кто-то, кто только что попал в 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 используют слово.

Ответ 4

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

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

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

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

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

Есть три разновидности атомного вектора, с которыми вы можете столкнуться:

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

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

Список

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

Пожалуйста, также обратитесь к этой ссылке.

Ответ 5

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

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

A list в R позволяет вам собирать множество объектов под одним именем (то есть имя списка) упорядоченным способом. Эти объекты могут быть матрицами, векторами, кадрами данных, даже другими списками и т.д. Даже не требуется, чтобы эти объекты были связаны друг с другом каким-либо образом.

Можно сказать, что список - это какой-то супертипный тип данных: вы можете хранить в нем практически любую часть информации!

Чтобы создать список, вы используете список функций(): my_list < - list (comp1, comp2...)

Аргументы функции списка - это компоненты списка. Помните, что эти компоненты могут быть матрицами, векторами, другими списками,...

Подводя итог, главная разница между списком и вектором заключается в том, что list в R позволяет вам собирать множество объектов под одним именем (то есть имя список) упорядоченным способом. Эти объекты могут быть матрицами, векторами, кадрами данных, даже другими списками и т.д. Даже не требуется, чтобы эти объекты были связаны друг с другом каким-либо образом... в то время как элементы в вектор все имеют одинаковый тип данных.

Ответ 6

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

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.