Типове данни в R с пример

⚡ Умно обобщение

Типовете данни в R определят как стойностите се съхраняват в паметта, а операторите решават какво R може да прави с тях. Тук са разгледани вектори, променливи, аритметични, релационни, логически и оператори за присвояване с изпълними примери.

  • 🔘 Atomвидове интегрални схеми: R съхранява всяка стойност като логическа, цяло число, двойна, комплексна, символна или сурова.
  • ☑️ Проверка на типа: class(), typeof() и mode() описват стойност от три различни гледни точки.
  • Вектори: Функцията c() изгражда едномерна колекция, в която всеки елемент споделя един тип.
  • 🧪 Operaторове: Аритметичните, релационните, логическите и операторите за присвояване покриват почти всеки базов R израз.
  • 🛠️ Подмножество: Квадратните скоби, комбинирани с логическо условие, филтрират векторните елементи в един ред.
  • ⚠️ Бележка към версията: R 4.3.0 превърна аргумент с дължина по-голяма от едно към && или || в грешка.

Типове данни в R

Какви са типовете данни в R?

Следват типовете данни или структурите на данни в R програмирането:

Тозият списък смесва две свързани идеи, а разделянето им прави останалата част от тази страница по-лесна за следване. тип данни описва какво представлява една стойност – число, текст, TRUE или FALSE. структура на данни описва колко стойности се държат заедно и в каква форма. Скаларите, векторите, матриците, кадрите от данни и списъците са структури; стойностите вътре в тях все още принадлежат към един от основните типове на R.

структура Размери Допускат ли се смесени типове? Типична употреба
скаларен Вектор с дължина 1 Не Единично измерване или флаг
Вектор 1 Не Колона от показания от един тип
матрица 2 Не Числови мрежи и линейна алгебра
Кадр от данни 2 Да, един тип на колона Таблични набори от данни
списък 1, но влагаемо Да, всичко за всеки елемент Резултати от модела и смесени контейнери

R няма отделен скаларен тип: скаларът е просто вектор с дължина едно, поради което толкова много R код се пише за цели вектори наведнъж.

Основни типове данни в R

Всяка стойност в R принадлежи към един от малък набор от основни (атомни) типове:

  • 4.5 е десетична стойност, наречена числова стойност.
  • 4 изглежда като цяло число, но R все пак го съхранява като тип double. Запишете 4L, когато е необходимо истинско цяло число.
  • TRUE или FALSE е булева стойност, наричана логическа в R.
  • Стойността вътре в ” ” или ' ’ е текст (низ). Тези стойности се наричат ​​символи.

Два допълнителни типа допълват набора. Комплексните стойности, като например 3+2i, съдържат реална и имагинерна част, а суровите стойности съдържат байтове. И двата типа се срещат рядко в ежедневния анализ, но са изброени в базовия R. документация за typeof() наред с четирите често срещани типа.

Тип Примерна стойност клас() връща typeof() връща
логичен TRUE логически логически
цяло число 4L цяло число цяло число
Double (числово) 4.5 цифров удвои
Характер „R е фантастичен“ характер характер
Комплекс 3+2i комплекс комплекс
Суров като.raw(10) суров суров

Можем да проверим типа на променлива с функцията на класа.

Пример 1: Проверка на числова променлива

# Declare variables of different types
# Numeric
x <- 28
class(x)

Изход:

## [1] "numeric"

Пример 2: Проверка на символна променлива

# String
y <- "R is Fantastic"
class(y)

Изход:

## [1] "character"

Пример 3: Проверка на логическа променлива

# Boolean
z <- TRUE
class(z)

Изход:

## [1] "logical"

Обърнете внимание, че class() отговаря с "numeric" за 28, въпреки че 28 няма десетична част. R го съхранява като double и само typeof() разкрива това. Следващата разлика, която си струва да се научи, е как тези стойности получават имена.

Променливи в R

Променливите са едни от основните градивни елементи в R, които съхраняват стойности и са важни за всеки, който се занимава с работа с данни. Променлива в R може да съхранява число, обект, статистически резултат, вектор, набор от данни или прогноза на модел - на практика всичко, което R извежда. Можем да използваме тази променлива по-късно, просто като извикаме името на променливата.

За да декларираме променлива в R, трябва да ѝ присвоим име. Името не трябва да съдържа интервал. Можем да използваме _, за да съединим две думи.

Имената могат да съдържат букви, цифри, точки и долни черти, но трябва да започват с буква или точка, а запазени думи като TRUE, FALSE и NULL не могат да се използват като имена. За да добавите стойност към променливата, използвайте <- или =.

Ето синтаксиса:

# First way to declare a variable:  use the `<-`
name_of_variable <- value
# Second way to declare a variable:  use the `=`
name_of_variable = value

В командния ред можем да напишем следните кодове, за да видим какво ще се случи:

Пример 1: Присвояване на стойност и нейното отпечатване

# Print variable x
x <- 42
x

Изход:

## [1] 42

Пример 2: Деклариране на втора променлива

y  <- 10
y

Изход:

## [1] 10

Пример 3: Използване на две променливи в един израз

# We call x and y and apply a subtraction
x-y

Изход:

## [1] 32

Променлива, която съдържа няколко стойности от един и същи тип, е вектор, което е структурата, която почти всяка R функция очаква.

Вектори в R

Векторът е едномерна колекция, в която всеки елемент споделя един и същ тип. Можем да създадем вектор с всички основни типове данни в R, научени по-рано. Най-лесният начин за изграждане на вектор в R е чрез използване на функцията c().

Пример 1: Създаване на числов вектор

# Numerical
vec_num <- c(1, 10, 49)
vec_num

Изход:

## [1]  1 10 49

Пример 2: Създаване на вектор на символи

# Character 
vec_chr <- c("a", "b", "c")
vec_chr

Изход:

## [1] "a" "b" "c"

Пример 3: Създаване на логически вектор

# Boolean 
vec_bool <-  c(TRUE, FALSE, TRUE)
vec_bool

Изход:

##[1] TRUE FALSE TRUE

Ако c() получи комбинация от типове, не се проваля. Той тихо привежда всеки елемент до най-общия наличен тип, така че c(1, "a", TRUE) става вектор на символи. Можем също да извършваме аритметични изчисления върху вектори в R.

Пример 4: Събиране на два вектора елемент по елемент

# Create the vectors
vect_1 <- c(1, 3, 5)
vect_2 <- c(2, 4, 6)
# Take the sum of A_vector and B_vector
sum_vect <- vect_1 + vect_2
# Print out total_vector
sum_vect

Изход:

[1]  3  7 11

Събирането се извършва елемент по елемент, защото и двата вектора имат еднаква дължина. Когато дължините се различават, R рециклира по-късия вектор, повтаряйки го, докато не съвпадне с по-дългия, и предупреждава само когато по-дългата дължина не е кратна на по-късата.

Пример 5: Разделяне на първите пет елемента

В R е възможно да се раздели вектор. В някои случаи се интересуваме само от първите пет елемента на вектора. Можем да използваме командата [1:5] за да...tracстойностите от 1 до 5.

# Slice the first five rows of the vector
slice_vector <- c(1,2,3,4,5,6,7,8,9,10)
slice_vector[1:5]

Изход:

## [1] 1 2 3 4 5

Пример 6: Изграждане на диапазон с двоеточие OperaTor

Най-краткият начин за създаване на диапазон от стойности е чрез използване на оператора двоеточие (:) между две числа. Например, от горния пример можем да напишем c(1:10), за да създадем вектор от стойности от едно до десет.

# Faster way to create adjacent values
c(1:10)

Изход:

## [1]  1  2  3  4  5  6  7  8  9 10

Тъй като векторът тихо променя типа си, когато е смесен, е добре да знаете как да проверявате и конвертирате типовете при поискване.

Как да проверяваме и конвертираме типове данни в R

Три семейства функции отговарят на трите въпроса, които възникват постоянно: какво е това, дали това е даден тип и може ли това да стане друг тип.

Семейство функции Въпрос, на който отговаря Примери
клас(), тип(), режим() Какъв тип е тази стойност? клас(28), тип(28), режим(28)
е.*() Тази стойност от тип X ли е? е.числов(), е.символен(), е.логичен()
като.*() Може ли тази стойност да стане тип X? като.число(), като.символ(), като.цяло число()
str() Как изглежда този обект като цяло? str(vec_num)
# Three different views of the same value
x <- 28
class(x)      # "numeric"  -- the class used for method dispatch
typeof(x)     # "double"   -- how R stores the value internally
mode(x)       # "numeric"  -- the older S-style mode

# Ask a yes/no question about a type
is.numeric(x)     # TRUE
is.character(x)   # FALSE

# Convert between types
as.character(x)   # "28"
as.integer("28")  # 28 stored as an integer
as.numeric("abc") # NA, with a coercion warning

Две правила обясняват повечето изненади тук. Първо, class() докладва класа, използван за изпращане на метода, докато typeof() докладва вътрешната памет, поради което 28 е „числово“ за единия и „double“ за другия. Второ, преобразуване, което не може да бъде успешно, не спира скрипта: as.numeric("abc") връща NA и отпечатва предупреждение за преобразуване, така че безшумните NA след импортиране почти винаги са проблем с типа. Същата логика ги движи. фактори, които съхраняват категориите като целочислени кодове плюс таблица с нива.

След като типовете са определени, следват операторите, които действат върху тях.

R Аритметика Operaтори

Първо ще разгледаме основните аритметични оператори в R. Следват аритметичните оператори в програмирането на R и какво означават те:

OperaTor Descriptйон
+ Допълнение
- ПодtracАЦИ
* Умножение
/ делене
^ или ** степенуване
%% Модуло (остатък след деление)
%/% Целочислено деление (частно, остатъкът се отхвърля)

Всеки един от тези оператори е векторизиран, така че един и същ израз работи както върху една стойност, така и върху цяла колона.

Пример 1: Събиране

# An addition
3 + 4

Изход:

## [1] 7

Можете лесно да копирате и поставите горния R код в RStudio Конзола. В тази статия изходът е показан на редове, започващи с ##. Например, ако напишем кода print("Guru99") конзолата отпечатва [1] "Guru99", което тази страница би показала като ## [1] "Guru99 ".

Символът ## маркира ред от отпечатан изход, а числото в квадратната скоба ([1]) е индексът на първата стойност на този ред, а не част от резултата.

Изреченията, започващи с #, са коментари. Можем да използваме # в R скрипт, за да добавим всяка желана бележка, а R я игнорира по време на изпълнение.

Пример 2: Умножение

# A multiplication
3*5

Изход:

## [1] 15

Пример 3: Деление

# A division
(5+5)/2

Изход:

## [1] 5

Пример 4: Степенуване

# Exponentiation
2^5

Изход:

## [1] 32

Пример 5: По модул

# Modulo
28%%6

Изход:

## [1] 4

Аритметиката генерира числа. Следващата група оператори генерира TRUE и FALSE вместо това.

R Релационен (Сравнение) Operaтори

Релационните оператори сравняват две стойности и връщат логически резултат. Те са операторите, които изграждат условията, използвани за филтриране, и се векторизират по абсолютно същия начин като аритметичните оператори.

OperaTor Descriptйон
> По-велик от
< Less от
>= По-голямо или равно на
<= Less отколкото или равно на
== Точно равно на
!= Не е равно на
a <- 10
b <- 3

a > b     # TRUE
a < b     # FALSE
a >= 10   # TRUE
a <= 3    # FALSE
a == b    # FALSE
a != b    # TRUE

# Relational operators are vectorised
scores <- c(45, 78, 90, 62)
scores >= 60   # FALSE TRUE TRUE TRUE

Два навика спестяват време тук. Използвайте == за сравнение и <- за присвояване, защото единичното = вътре в условие е често срещана грешка за начинаещи. И избягвайте == при числа с плаваща запетая: закръгляването на числа с плаваща запетая означава, че 0.1 + 0.2 == 0.3 е FALSE, така че isTRUE(all.equal(0.1 + 0.2, 0.3)) е безопасният тест. Сравненията на сортирани рамки от данни следват същите правила.

R Логично Operaтори

С логическите оператори искаме да върнем стойности във вектора въз основа на логически условия. Таблицата по-долу изброява логическите оператори, налични в R.

Справочна таблица на логически и релационни оператори в R с техните значения

Логическите оператори в R са обвити в [. Можем да добавим колкото желаем условни оператори, но трябва да ги включим в скоби. Можем да следваме тази структура, за да създадем условен оператор:

variable_name[(conditional_statement)]

Като име_на_променлива (variable_name) се отнася до променливата, която искаме да използваме за оператора, създаваме логическия оператор, например име_на_променлива > 0. Накрая използваме квадратните скоби, за да финализираме логическия оператор. По-долу е даден пример за логически оператор.

Пример 1: Сравнете всеки елемент от вектор

# Create a vector from 1 to 10
logical_vector <- c(1:10)
logical_vector>5

Изход:

## [1]FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

В горния изход, R прочита всяка стойност и я сравнява с оператора logical_vector>5. Ако стойността е строго по-голяма от пет, тогава условието е TRUE, в противен случай FALSE. R връща вектор от TRUE и FALSE.

Пример 2: Запазване само на съвпадащите елементи

В примера по-долу искаме даtracстойностите, които отговарят само на условието „е строго по-голямо от пет“. За тази цел можем да оградим условието в квадратни скоби, пред които е поставен векторът, съдържащ стойностите.

# Print value strictly above 5
logical_vector[(logical_vector>5)]

Изход:

## [1]  6  7  8  9 10

Пример 3: Комбиниране на две условия

# Print 5 and 6
logical_vector <- c(1:10)
logical_vector[(logical_vector>4) & (logical_vector<7)]

Изход:

## [1] 5 6

Пример 3 използва единичния амперсанд & нарочно. Едносимволните оператори & и | сравняват вектори елемент по елемент и връщат вектор, което е необходимо за подмножество. Формите с двоен символ && и || връщат една стойност и принадлежат към условията if() и while(). Тъй като R 4.3.0Предаването на аргумент, по-дълъг от един елемент, на && или || е грешка, а не предупреждение, така че двете семейства вече не са взаимозаменяеми. Операторът ! отменя условие, а xor() дава изключващо ИЛИ.

Задание R Operaтори

Операторите за присвояване свързват стойност с име. R предлага повече от тях от повечето езици за програмиране и разликите стават важни, след като кодът премине в... функции.

OperaTor Descriptйон
<- Ляво присвояване, идиоматичният избор в R
= Ляво присвояване, но обикновено запазено за аргументи на функция
-> Правилно присвояване, валидно, но рядко използвано
<<- Суперприсвояване, което търси в обхващащи среди
- >> Дясно суперприсвояване
# Left assignment -- the idiomatic form
count <- 5

# Equals sign: works, but reserve it for function arguments
count = 5
round(3.14159, digits = 2)

# Right assignment
5 -> count

# Superassignment, used inside functions to reach an outer scope
count <<- 5

Ръководствата за стил препоръчват <- за създаване на обекти и = за именуване на аргументи в рамките на извикване, защото двете роли остават визуално различни. Използвайте <<- пестеливо: той променя обект извън текущата функция и прави кода по-труден за разсъждение. След като присвояването и типовете са удобни, следващите стъпки са импортиране на реални данни и Решаping то с dplyr; на Преглед на езика R поставя цялата верига от инструменти в контекст.

Въпроси и Отговори

Векторът съдържа елементи само от един тип, а смесването на типове налага принуда. Списъкът съдържа всичко във всеки слот, включително други списъци, рамки от данни или функции, поради което обектите на модела са списъци.

Когато два вектора с различна дължина срещнат даден оператор, R повтаря по-късия, докато дължините им съвпаднат. c(1,2,3,4) + c(1,2) дава 2 4 4 6. Предупреждение се появява само когато по-дългата дължина не е кратно на числото.

NA маркира липсваща стойност във вектор. NULL маркира липсата на обект и има нулева дължина. NaN е недефиниран числов резултат, например 0/0. Inf е деление на нула, както в 1/0.

Операторът %in% проверява принадлежността и връща TRUE за всеки ляв елемент, намерен в десния вектор. c(2,7) %in% c(1,2,3) връща TRUE FALSE. Той замества дълги вериги от сравнения ==, свързани с |.

Изберете матрица за числови мрежи и линейна алгебра, a рамка с данни за таблици, чиито колони се различават по тип, и a списък когато елементите имат различни форми.

Въведен в R 4.1.0, |> предава стойността отляво на първия аргумент на функцията отдясно. Той свързва стъпки без вложени извиквания и не се нуждае от пакет, за разлика от magrittr %>% pipe.

Асистентите с изкуствен интелект сигнализират за несъответствия в типовете, предлагат as.* преобразувания и изготвят код за прекодиране от извадка от редове. Те също така предлагат стъпки за разработване на функции преди... машинно обучение моделът е настроен. Винаги проверявайте генерирания код спрямо вашите данни.

Да. RStudio 2023.09.0 и по-нови версии се доставят Копилот на GitHub интеграция, която допълва R изрази вградено. Необходим е абонамент за Copilot и администраторите трябва да го активират на RStudio Server или Posit Workbench.

Обобщете тази публикация с: