Які відмінності між типовими даними векторного та списку в R?


127

Які основні відмінності між типами даних векторних та списку в R? Які переваги чи недоліки використання (або ні) цих двох типів даних?

Буду вдячний побачити приклади, які демонструють випадки використання типів даних.

Відповіді:


77

Технічно списки - це вектори, хоча дуже мало хто вживає цей термін. "список" - це один із декількох режимів, при цьому інші є "логічним", "символьним", "числовим", "цілим". Те, що ви називаєте векторами, - це "атомні вектори", строго кажучи:

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

Списки "рекурсивного" типу (векторного), тоді як атомні вектори не є:

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

Ви обробляєте об'єкти даних з різними функціями залежно від того, є вони рекурсивними, атомними чи мають розмірні атрибути (матриці та масиви). Однак я не впевнений, що обговорення "переваг та недоліків" різних структур даних є достатньо зосередженим питанням для ПП. Щоб додати те, що сказав Томмі, окрім списків, здатних містити довільну кількість інших векторів, існує наявність фреймів даних, які є певним типом списку, який має розмірний атрибут, який визначає його структуру. На відміну від матриць та масивів, які є дійсно складеними атомними об'єктами, фрейми даних можуть містити різні типи, включаючи типи факторів.

Існує також застереження, що is.vectorфункція повернеться, FALSEякщо є інші атрибути, крім імен. Дивіться: що таке вектор?


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 / векторні одиниці.


3
Ви можете мати keys у векторах, використовуючи namesметод.
gokul_uf

9

На ці та подібні вступні запитання відповідають на http://www.burns-stat.com/pages/Tutor/hints_R_begin.html

Це покликане бути ніжним вступом, яке підводить вас і працює з R якомога швидше. Певною мірою це вдається.

--- Редагувати: -

Спроба пояснити далі; цитується з наведеної вище посилання.

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

Існує три різновиди атомного вектора, які ви, швидше за все, зіткнете:

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

Про атомні вектори слід пам’ятати, що всі елементи в них лише одного типу.

Список

Списки можуть мати різні типи елементів у різних компонентах. Компонентом списку може бути інший список, атомний вектор (та інші речі).

Будь ласка, перейдіть за цим посиланням.


2
Підкреслено: вам слід принаймні вказати на конкретний розділ веб-сайту, який відповідає на оригінальне запитання.
nbro

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

що означає список, що містить декілька типів даних, таких як числовий, символьний та логічний у моєму списку. Але у векторному буде єдиний тип даних усіх елементів у цьому векторі

для:

для вектора:

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

#which means all elements of vector containing single data type that is numeric only.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.