Каковы основные различия между векторными и списковыми типами данных в R? Каковы преимущества или недостатки использования (или не) этих двух типов данных?
Я был бы рад видеть примеры, демонстрирующие варианты использования типов данных.
Каковы основные различия между векторными и списковыми типами данных в R? Каковы преимущества или недостатки использования (или не) этих двух типов данных?
Я был бы рад видеть примеры, демонстрирующие варианты использования типов данных.
Технически списки - это векторы, хотя очень немногие используют этот термин. "Список" - один из нескольких режимов, другие - "логические", "символьные", "числовые", "целые". То, что вы называете векторами, является "атомарным" в строгом R-выражении:
aaa <- vector("list", 3)
is.list(aaa) #TRUE
is.vector(aaa) #TRUE
Списки представляют собой "рекурсивный" тип, тогда как атомные векторы не являются:
is.recursive(aaa) # TRUE
is.atomic(aaa) # FALSE
Вы обрабатываете объекты данных с различными функциями в зависимости от того, являются они рекурсивными, атомными или имеют размерные атрибуты (матрицы и массивы). Однако я не уверен, что обсуждение "преимуществ и недостатков" различных структур данных является достаточно сфокусированным вопросом для SO. Чтобы добавить к тому, что сказал Томми, помимо списков, способных удерживать произвольное количество других векторов, есть доступность данных, которые являются конкретным типом списка, который имеет атрибут размерности, который определяет его структуру. В отличие от матриц и массивов, которые представляют собой действительно сложенные атомарные объекты, данные могут содержать различные типы, включая типы факторов.
Списки являются "рекурсивными". Это означает, что они могут содержать значения разных типов, даже других списков:
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)
Атомные векторы (не-список, но числовые, логические и символьные) полезны, поскольку все элементы, как известно, имеют один и тот же тип. Это делает их очень быстрыми.
Как кто-то, кто только что попал в 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 используют слово.
Ответы на этот и другие вводные вопросы приведены по адресу http://www.burns-stat.com/pages/Tutor/hints_R_begin.html.
Предполагается, что это мягкое введение, которое поможет вам как можно быстрее начать работать с R. В какой-то степени это удается.
--- Редактировать: --
Попытка объяснить дальше; цитируется по приведенной выше ссылке.
Атомный вектор
Есть три разновидности атомного вектора, с которыми вы можете столкнуться:
- "Числовой"
- "Логическое"
- "персонаж"
Что нужно помнить об атомных векторах, так это то, что все элементы в них принадлежат только одному типу.
Список
Списки могут иметь разные типы элементов в разных компонентах. Компонент списка может быть другим списком, атомарным вектором (и другими вещами).
Пожалуйста, также обратитесь к этой ссылке.
Векторы (одномерный массив): могут содержать числовые, символьные или логические значения. Элементы в векторе все имеют одинаковый тип данных.
Список в R похож на ваш список дел на работе или в школе: разные элементы в этом списке, скорее всего, различаются по длине, характеристике, типу деятельности, которая должна выполняться,...
A list в R позволяет вам собирать множество объектов под одним именем (то есть имя списка) упорядоченным способом. Эти объекты могут быть матрицами, векторами, кадрами данных, даже другими списками и т.д. Даже не требуется, чтобы эти объекты были связаны друг с другом каким-либо образом.
Можно сказать, что список - это какой-то супертипный тип данных: вы можете хранить в нем практически любую часть информации!
Чтобы создать список, вы используете список функций(): my_list < - list (comp1, comp2...)
Аргументы функции списка - это компоненты списка. Помните, что эти компоненты могут быть матрицами, векторами, другими списками,...
Подводя итог, главная разница между списком и вектором заключается в том, что list в R позволяет вам собирать множество объектов под одним именем (то есть имя список) упорядоченным способом. Эти объекты могут быть матрицами, векторами, кадрами данных, даже другими списками и т.д. Даже не требуется, чтобы эти объекты были связаны друг с другом каким-либо образом... в то время как элементы в вектор все имеют одинаковый тип данных.
список включает несколько типов данных, таких как символьные, числовые, логические и т.д. но вектор содержит только аналогичный тип данных. Например:
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.