R Data Frame: Как да създадете, добавите, изберете и подмножество
⚡ Умно обобщение
R Data Frame съхранява колони от различни типове с еднаква дължина, което го прави стандартната правоъгълна структура за анализ. Квадратните скоби разделят редове и колони, знакът за долар достига колона, а subset() филтрира по условие.

Какво е Data Frame?
A рамка с данни е списък от вектори с еднаква дължина. Матрицата съдържа само един тип данни, докато рамката от данни приема различни типове данни (числови, символни, факторни и др.).
Това определение поставя рамката от данни между два съседа, които ще срещате постоянно в R. A. матрица е правоъгълна, но еднотипна, и a списък е многотипизиран, но неравномерен. Рамката от данни заимства по едно свойство от всеки тип.
| структура | Типове колони | Дължини на елементите | Типична употреба |
|---|---|---|---|
| Вектор | Само един вид | Единична последователност | Една променлива |
| матрица | Само един вид | Правоъгълен | Числова алгебра |
| списък | Всякаква комбинация от видове | Може да се различава за всеки елемент | Произволни събирания |
| Кадр от данни | Всякаква комбинация от видове | Всяка колона с еднаква дължина | Табличен анализ |
Тъй като рамката с данни всъщност е списък отдолу, методите за достъп, използвани в списъците, работят и тук, поради което знакът за долар се появява отново по-късно в този урок.
Как да създадете рамка с данни
Можем да създадем рамка с данни в R чрез предаване на променливите a, b, c и d във функцията data.frame(). Можем да създадем рамката с данни и да именуваме колоните с names(), като просто укажем името на всяка променлива.
data.frame(df, stringsAsFactors = TRUE)
Аргументи:
- df: Може да бъде матрица, която да се преобразува като рамка от данни, или колекция от променливи, които да се съединят
- stringsAsFactors: Контролира дали векторите от символи стават фактор колони. Фабричната стойност по подразбиране беше TRUE в по-старите версии и е FALSE от R 4.0.0 насам, така че го предайте изрично, когато поведението е от значение.
Можем да създадем рамка от данни в R за нашия първи набор от данни, като комбинираме четири променливи с еднаква дължина.
# Create a, b, c, d variables a <- c(10,20,30,40) b <- c('book', 'pen', 'textbook', 'pencil_case') c <- c(TRUE,FALSE,TRUE,FALSE) d <- c(2.5, 8, 10, 7) # Join the variables to create a data frame df <- data.frame(a,b,c,d) df
Изход:
## a b c d ## 1 10 book TRUE 2.5 ## 2 20 pen FALSE 8.0 ## 3 30 textbook TRUE 10.0 ## 4 40 pencil_case FALSE 7.0
Всеки вектор стана колона, а четирите стойности във всеки вектор станаха четирите реда. Обърнете внимание, че аргументите бяха неназовани, така че R изведе заглавките на колоните от самите имена на променливи.
Виждаме, че заглавките на колоните имат същото име като променливите. Можем да променим името на колоната в R с функцията names(). Проверете примера за R create dataframe по-долу:
# Name the data frame names(df) <- c('ID', 'items', 'store', 'price') df
Изход:
## ID items store price ## 1 10 book TRUE 2.5 ## 2 20 pen FALSE 8.0 ## 3 30 textbook TRUE 10.0 ## 4 40 pencil_case FALSE 7.0
Присвояването на names() замества всеки заглавен файл наведнъж, така че векторът за заместване трябва да има точно един запис на колона. За да преименувате една колона, индексирайте вектора на names, както е в names(df)[2] <- 'product'.
# Print the structure
str(df)
Изход:
## 'data.frame': 4 obs. of 4 variables: ## $ ID : num 10 20 30 40 ## $ items: Factor w/ 4 levels "book","pen","pencil_case",..: 1 2 4 3 ## $ store: logi TRUE FALSE TRUE FALSE ## $ price: num 2.5 8 10 7
Бележка за версията. Горният резултат е генериран в R версия, по-стара от 4.0.0, където data.frame() преобразува символни вектори във фактори по подразбиране, поради което items се отчита като фактор с четири нива. Базовата R документация записва, че това е фабрично зададена стойност по подразбиране. променено на stringsAsFactors = FALSE за R 4.0.0Изпълнението на същия код в текуща версия оставя елементите като обикновена символна колона, а str() отпечатва chr вместо това. Добавете stringsAsFactors = TRUE към извикването на data.frame(), за да възпроизведете отпечатания изход, или прочетете урок за фактори за случаите, когато факторите действително са необходими.
Рамка с данни за срез
След като рамката е построена, следващата задача е да издърпаме части от нея. Нарязването е основният начин в R за това и използва същите квадратни скоби като векторите, само че с две позиции вместо една.
Възможно е да се извършват SLICE стойности на рамка с данни. Избираме редовете и колоните, които да върнем, в скоби, предшествани от името на рамката с данни.
Рамката с данни е съставена от редове и колони, df[A, B]. A представлява редовете, а B - колоните. Можем да нарязваме или чрез указване на редовете и/или колоните.
От снимка 1 по-долу, лявата част представлява редове, а дясната част е колони. Имайте предвид, че символът : означава да се. Например 1:3 има за цел да избере стойности от 1 да се 3.
На диаграмата по-долу показваме как да получите достъп до различните селекции от рамката с данни:
- Жълтата стрелка избира ред 1 в колона 2
- Зелената стрелка избира редове 1 да 2
- Червената стрелка избира колона 1
- Синята стрелка избира редове 1 до 3 и колони 3 да 4
Имайте предвид, че ако оставим лявата част празна, R ще избере всички редове. По аналогия, ако оставим дясната част празна, R ще избере всички колони.
Можем да изпълним кода в конзолата:
## Select row 1 in column 2
df[1,2]
Изход:
## [1] book ## Levels: book pen pencil_case textbook
Редът „Нива“ се появява, защото items е фактор в тази сесия. В R 4.0.0 и по-нови версии същото извикване отпечатва единствения низ „книга“ без ред „Нива“.
## Select Rows 1 to 2
df[1:2,]
Изход:
## ID items store price ## 1 10 book TRUE 2.5 ## 2 20 pen FALSE 8.0
## Select Columns 1
df[,1]
Изход:
## [1] 10 20 30 40
Избирането на една колона с df[,1] премахва обвивката на рамката и връща обикновен вектор. Добавете drop = FALSE, както в df[, 1, drop = FALSE], когато е необходим рамка с една колона данни.
## Select Rows 1 to 3 and columns 3 to 4
df[1:3, 3:4]
Изход:
## store price ## 1 TRUE 2.5 ## 2 FALSE 8.0 ## 3 TRUE 10.0
Възможно е също така да изберете колоните с техните имена. Например, кодът по-долу extracts две колони: ID и store.
# Slice with columns name df[, c('ID', 'store')]
Изход:
## ID store ## 1 10 TRUE ## 2 20 FALSE ## 3 30 TRUE ## 4 40 FALSE
Имената са по-безопасни от позициите в производствения код, защото вмъкването или пренареждането на колона тихомълком променя към какво се отнася df[, 3], докато df[, 'store'] продължава да сочи към едни и същи данни.
Добавяне на колона към рамка с данни
Можете също да добавите колона към рамка с данни. Трябва да използвате символа $, за да наименувате новата променлива и да добавите колона към рамка с данни в R.
# Create a new vector quantity <- c(10, 35, 40, 5) # Add `quantity` to the `df` data frame df$quantity <- quantity df
Изход:
## ID items store price quantity ## 1 10 book TRUE 2.5 10 ## 2 20 pen FALSE 8.0 35 ## 3 30 textbook TRUE 10.0 40 ## 4 40 pencil_case FALSE 7.0 5
Забележка: Броят на елементите във вектора трябва да е равен на броя на елементите в кадъра с данни. Изпълнението на следния оператор за добавяне на колона към кадъра с данни в R
quantity <- c(10, 35, 40)
# Add `quantity` to the `df` data frame
df$quantity <- quantity
Дава грешка:
Error in `lt;-.data.frame`(`*tmp*`, quantity, value = c(10, 35, 40))
replacement has 3 rows, data has 4
Съобщението назовава оператора за заместване за кадрите с данни и посочва и двата броя, така че ви казва точно какво да поправите. R рециклира заместване само когато дължината му разделя броя на редовете по равно, поради което стойност с дължина 1, като например df$currency <- 'EUR', се приема, докато вектор с дължина 3 срещу четири реда се отхвърля. cbind() добавя колона по същия начин, а rbind() е неговият еквивалент за добавяне на редове.
Изберете колона от рамка с данни
Понякога е необходимо да съхраним колона от рамка с данни за бъдеща употреба или да извършим операция върху колона. Можем да използваме знака $, за да изберем колоната от рамка с данни.
# Select the column ID
df$ID
Изход:
## [1] 1 2 3 4
Прочетете внимателно този изход. ID е изграден от вектора c(10, 20, 30, 40), така че конзолата на живо отпечатва 10 20 30 40 тук; показаните по-горе 1 2 3 4 са позиции на редове, а не съхранени стойности. [1] в началото на реда е просто индексът на първия елемент на този ред, а не част от данните.
Три маршрута достигат до една и съща колона: df$ID, df[['ID']] и df[, 'ID']. Знакът за долар извършва частично съвпадение, така че df$I все пак би намерил ID, което е удобно в конзолата и рисковано в запазен скрипт.
Поднабор на рамка с данни
В предишния раздел избрахме цяла колона без условие. Възможно е да подмножество въз основа на това дали определено условие е вярно или не.
Използваме функцията subset().
subset(x, condition) arguments: - x: data frame used to perform the subset - condition: define the conditional statement
Искаме да върнем само артикулите с цена над 5, така че можем да направим следното:
# Select price above 5
subset(df, subset = price > 5)
Изход:
ID items store price 2 20 pen FALSE 8 3 30 textbook TRUE 10 4 40 pencil_case FALSE 7
Етикетите на редове 2, 3 и 4 са оригиналните имена на редове, пренесени от df, което е начинът, по който можете да разберете, че първият ред е бил филтриран. subset() също приема аргумент select за едновременно избиране на колони, а еквивалентната форма със скоби е df[df$price > 5, ]. Формата със скоби запазва NA редове, където условието липсва, докато subset() ги премахва, така че двете не винаги са взаимозаменяеми.

![Синтаксис за нарязване на рамки от данни в R df[A, B] с редове отляво на запетаята и колони отдясно](https://www.guru99.com/images/r_programming/032918_1452_RDataFrames1.png)
