Каковы различия между векторными и списочными типами данных в R? - PullRequest
107 голосов
/ 21 декабря 2011

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

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

Ответы [ 6 ]

66 голосов
/ 21 декабря 2011

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

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

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

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

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

46 голосов
/ 21 декабря 2011

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

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)

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

17 голосов
/ 02 сентября 2014

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

8 голосов
/ 22 декабря 2011

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

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

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

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

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

Существует три разновидности атомного вектора, которые вы можете встреча:

  • «числовой»
  • «логично»
  • «символ»

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

Список

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

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

3 голосов
/ 01 ноября 2017

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

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

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

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

Для построения списка вы используете функцию list (): my_list <- список (comp1, comp2 ...) </strong>

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

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

2 голосов
/ 09 мая 2018

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

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...