English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Типы данных в R

Тип данных - это обширная система, используемая для объявления различных типов переменных или функций.

Тип переменной определяет объем памяти, занимаемый переменной, и то, как интерпретировать хранимый битовый шаблон.

Наиболее основными типами данных в Р-языке主要有 три:

  • Числовые

  • Логический

  • Текст

Основные типы числовых констант主要有 два:

Обычный тип123 -0.125
Научная запись1.23e2 -1.25E-1

Логический тип в многих других языках программирования часто называется типом Boolean, значения констант только TRUE и FALSE.

Внимание:Р-язык различает регистр, true или True не может быть заменено TRUE.

Наиболее直观ым типом данных является текстовый тип. Текст, как правило, встречается в других языках программирования в виде строки (String), константы заключены в двойные кавычки. В Р-языке текстовые константы могут быть заключены в одиночные или двойные кавычки, например:

> 'w3codebox' == "w3codebox"
[1] TRUE

Определение переменных в Р-языке не похоже на синтаксис некоторых языков с сильным типом, где необходимо专门 устанавливать имя и тип данных для переменных, при каждом использовании оператора присваивания в Р на самом деле определяется новый переменная:

a = 1
b <- TRUE
b = "abc"

По типу объекта они делятся на следующие 6 видов (они будут подробно рассмотрены позже):

Вектор

Вектор (Vector) в стандарных библиотеках языков программирования, таких как Java, Rust, C#, часто предоставляется, потому что вектор является незаменимым инструментом для математических вычислений - наиболее часто используемый вектор - это двумерный вектор, который必然会 использоваться в плоской координатной системе.

С точки зрения данных, вектор представляет собой линейный список, который можно рассматривать как массив.

В Р-языке вектор как тип существует, что упрощает операции с векторами:

> a = c(3, 4)
> b = c(5, 0)
> a + b
[1] 8 4
>

Функция c() - это функция создания векторов.

Здесь к двум двумерным векторам добавляют, чтобы получить новый двумерный вектор (8, 4). Если выполнить операцию с двумерным вектором и трехмерным вектором, теряется математический смысл, хотя программа продолжит работать, но будет выведено предупреждение.

Я рекомендую избегать такой ситуации по привычке.

Каждый элемент вектора можно извлечь по индексу отдельно:

> a = c(10, 20, 30, 40, 50)
> a[2]
[1] 20

Внимание:Я рекомендую избегать такой ситуации по привычке.

R также может легко извлекать часть вектора:

> a[1:4] # Извлечь 1-е до 4-го элементов, включая 1-й и 4-й элементы
[1] 10 20 30 40
> a[c(1, 3, 5)] # Извлечь 1-е, 3-е и 5-е элементы
[1] 10 30 50
> a[c(-1, -5)] # Удалить 1-е и 5-е элементы
[1] 20 30 40

Эти три метода извлечения частей вектора являются наиболее часто используемыми.

Вектор поддерживает скалярные вычисления:

> c(1.1, 1.2, 1.3) - 0.5
[1] 0.6 0.7 0.8
> a = c(1, 2)
> a ^ 2
[1] 1 4

Ранее рассмотренные常用ные математические операционные функции, такие как sqrt, exp и т.д., также могут использоваться для скалярных операций над векторами.

"Вектор" как линейная структура данных должен обладать некоторыми常用ными функциями обработки линейных структур данных, и R действительно обладает этими функциями:

Сортировка вектора:

> a = c(1, 3, 5, 2, 4, 6)
> sort(a)
[1] 1 2 3 4 5 6
> rev(a)
[1] 6 4 2 5 3 1
> order(a)
[1] 1 4 2 5 3 6
> a[order(a)]
[1] 1 2 3 4 5 6

Функция order() возвращает индексный вектор после сортировки вектора.

Статистика вектора

В R есть очень полные статистические функции:

Имя функцииЗначение
sumСумма
meanСреднее арифметическое
varВariance
sdСреднеквадратичное отклонение
minМинимальное значение
maxМаксимальное значение
rangeИнтервал значений (двумерный вектор, максимальное и минимальное значения)

Пример статистики вектора:

> sum(1:5)
[1] 15
> sd(1:5)
[1] 1.581139
> range(1:5)
[1] 1 5

Генерация вектора

Генерация вектора может быть выполнена с помощью c() Функция генерации, а также можно использовать оператор min:max для генерации последовательности.

Если нужно генерировать арифметическую прогрессию с интервалом, можно использовать seq Функция:

> seq(1, 9, 2)
[1] 1 3 5 7 9

seq может генерировать арифметическую прогрессию от m до n, нужно только указать m, n и длину последовательности:

> seq(0, 1, length.out=3)
[1] 0.0 0.5 1.0

Rep означает repeat (повторять), и может использоваться для создания последовательности чисел, повторяющихся несколько раз:

> rep(0, 5)
[1] 0 0 0 0 0

В векторе часто используются NA и NULL, здесь мы расскажем о этих двух словах и их различиях:

  • NA означает "пропущенный", NULL означает "отсутствующий".

  • NA пропущенный, как占емник, означает, что здесь нет значения, но положение существует.

  • NULL означает, что данные отсутствуют.

Пример объяснения:

> length(c(NA, NA, NULL))
[1] 2
> c(NA, NA, NULL, NA)
[1] NA NA NA

Очевидно, NULL в векторе не имеет никакого значения.

Логический

Логические векторы主要用于 логические операции с векторами, например:

> c(1, 2, 3) > 2
[1] FALSE FALSE TRUE

Функция which является одной из самых распространенных функций обработки логических векторов, и она может использоваться для выбора индексов необходимых данных:

> a = c(1, 2, 3)
> b = a > 2
> print(b)
[1] FALSE FALSE TRUE
> which(b)
> m1[1,3] # Строка 1, столбец 3

Например, нам нужно отфильтровать данные из линейного списка, которые больше или равны 60 и меньше 70:

> vector = c(10, 40, 78, 64, 53, 62, 69, 70)
> print(vector[which(vector >= 60 & vector < 70)])
[1] 64 62 69

Похожие функции также include all и any:

> all(c(TRUE, TRUE, TRUE))
[1] TRUE
> all(c(TRUE, TRUE, FALSE))
[1] FALSE
> any(c(TRUE, FALSE, FALSE))
[1] TRUE
> any(c(FALSE, FALSE, FALSE))
[1] FALSE

all() используется для проверки, является ли логический вектор полностью TRUE, any() используется для проверки наличия TRUE в логическом векторе.

Строка

Строка данных herself не слишком сложна, здесь мы着重介绍 функции операций со строками:

toupper("w3codebox") # 转换为大写
[1] "w3codebox"
tolower("w3codebox") # 转换为小写
[1] "w3codebox"
nchar("中文", type="bytes") # 统计字节长度
[1] 4
nchar("中文", type="char") # Общее количество символов
[1] 2
substr("123456789", 1, 5) # Вырезать строку, начиная с 1 до 5
[1] "12345"
substring("1234567890", 5) # Вырезать строку, начиная с 5 до конца
[1] "567890"
as.numeric("12") # Преобразовать строку в число
[1] 12
as.character(12.34) # Преобразовать число в строку
[1] "12.34"
strsplit("2019;10;1", ";") # Разделить строку по разделителю
[[1]]
[1] "2019" "10"        "1"
gsub("/", "-", "2019/10/1") # Заменить строку
[1] "2019-10-1"

На компьютерах с Windows используется стандарт кодировки GBK, поэтому один китайский символ занимает два байта, если программа запущена на компьютере с кодировкой UTF-8, длина одного китайского символа должна быть 3 байта.

Язык R поддерживает регулярные выражения в формате perl:

gsub("[[:alpha:]]+", "$", "Two words")
[1] "$ $"

Более подробную информацию о строках см. здесь:Введение в строковые функции языка R.

Матрица

Язык R предоставляет тип матрицы для исследования линейной алгебры, которая очень похожа на двумерные массивы других языков, но R предоставляет поддержку для матричных операций на уровне языка.

Наблюдаем создание матрицы:

vector=c(1, 2, 3, 4, 5, 6)
matrix(vector, 2, 3)
     [,1]        [,2]        [,3]
[1,]        1        3        5
[2,]        2        4        6

Содержимое инициализации матрицы передается через вектор, а также указывается, сколько строк и столбцов у матрицы.

Значения вектора заполняют матрицу столбцами. Если нужно заполнить по строкам, нужно указать атрибут byrow:

matrix(vector, 2, 3, byrow=TRUE)
     [,1]        [,2]        [,3]
[1,]        1        2        3
[2,]        4        5        6

В каждой ячейке матрицы можно напрямую получить значение:

m1 = matrix(vector, 2, 3, byrow=TRUE)
> m1[1,1] # 第 1 行 第 1 列 
> m1[1,1] # Строка 1, столбец 1
[1] 1
> m1[1,3] # Строка 1, столбец 3

[1] 3

> R中的矩阵 каждая строка и каждый столбец могут быть названы, этот процесс выполняется через вектор строк в массовом порядке:
> colnames(m1) = c("x", "y", "z")
> rownames(m1) = c("a", "b")
  > m1["a", ]
> m1
a 1 2 3
b 4 5 6
> m1["a", ] 
x y z

1 2 3

Вычисления матричных операций аналогичны вычислениям векторных, они могут выполняться как с скалярами, так и с матрицами того же размера, выполняя операции по соответствующим位置的 элементов.

> m1 = matrix(c(1, 2), 1, 2)
> m2 = matrix(c(3, 4), 2, 1)
> m1 %*% m2
     [,1]
[1,]   11

Обратная матрица:

> A = matrix(c(1, 3, 2, 4), 2, 2)
> solve(A)
     [,1] [,2]
[1,] -2.0  1.0
[2,]  1.5 -0.5

Функция apply() может использовать каждую строку или каждый столбец матрицы как вектор для выполнения операций:

> (A = matrix(c(1, 3, 2, 4), 2, 2))
     [,1] [,2]
[1,]    1    2
[2,]    3    4
> apply(A, 1, sum) # Второй параметр равен 1 операции по строкам, с использованием функции sum()
[1] 3 7
> apply(A, 2, sum) # Второй параметр равен 2 операции по столбцам
[1] 4 6

Более подробную информацию о матрицах см.:Матрицы в R.