R adatkeret: Létrehozás, hozzáfűzés, kijelölés és részhalmaz

⚡ Okos összefoglaló

Az R Data Frame a különböző típusú oszlopokat egyenlő hosszúságban tárolja, ami a standard téglalap alakú struktúrává teszi az elemzésekhez. A szögletes zárójelek szeletelik a sorokat és az oszlopokat, a dollárjel egy oszlopot ér el, a subset() pedig feltétel szerint szűr.

  • 🧱 Szerkezet: Egy adatkeret egyenlő hosszúságú vektorok listája, így minden oszlop más típust tartalmazhat.
  • 🇧🇷 Teremtés: A data.frame(a, b, c, d) négy vektort illeszt össze, és a names() ezután minden oszlopot átnevez.
  • ✂️ Szeletelés: A df[A, B] először sorokat, majd oszlopokat olvas be, és egy üres oldal mindent kijelöl az adott oldalon.
  • Hozzáfűzés: A df$quantity egy új oszlopot rendel hozzá, feltéve, hogy az új vektor pontosan megegyezik a sorok számával.
  • ???? Szűrő: A subset(df, subset = price > 5) csak azokat a sorokat tartja meg, ahol a feltétel IGAZ értéket ad.
  • ⚠️ Változat Shift: Az R 4.0.0 óta a stringsAsFactors alapértelmezett értéke FALSE, így a szövegoszlopok karakterek maradnak.

R adatkeret létrehozása, hozzáfűzés, kiválasztás és részhalmaz

Mi az adatkeret?

A adatkeret egy egyenlő hosszúságú vektorok listája. Egy mátrix csak egyféle adatot tartalmaz, míg egy adatkeret különböző adattípusokat fogad el (numerikus, karakteres, faktoros stb.).

Ez a definíció az adatkeretet két olyan szomszéd közé helyezi, amelyekkel folyamatosan találkozunk az R-ben. mátrix téglalap alakú, de egyetlen típussal rendelkezik, és egy lista többtípusú, de egyenetlen. Az adatkeret mindegyikből kölcsönöz egy tulajdonságot.

Szerkezet Oszloptípusok Elemhosszak Tipikus felhasználás
vektor Csak egy típus Egyetlen szekvencia Egy változó
Mátrix Csak egy típus Négyszögletes Numerikus algebra
Lista Bármilyen típusok keveréke Elemenként eltérő lehet Önkényes behajtások
Adatkeret Bármilyen típusok keveréke Minden oszlop egyenlő hosszúságú Táblázatos elemzés

Mivel egy adatkeret valójában egy lista alatta, a listákon használt elérők itt is működnek, ezért jelenik meg újra a dollárjel a bemutató későbbi részében.

Hogyan hozzunk létre adatkeretet

Létrehozhatunk egy adatkeretet R az a, b, c és d változók data.frame() függvénybe való átadásával. Létrehozhatjuk az adatkeretet, és elnevezhetjük az oszlopokat a names() függvénnyel, egyszerűen megadva az egyes változók nevét.

data.frame(df, stringsAsFactors = TRUE)

érvek:

  • df: Ez lehet egy adatkeretként konvertálandó mátrix, vagy az összekapcsolandó változók gyűjteménye
  • stringsAsFactors: Azt szabályozza, hogy a karaktervektorok faktoroszlopokká váljanak-e. A gyári alapértelmezés a régebbi kiadásokban IGAZ volt, az R 4.0.0 óta pedig HAMIS, ezért explicit módon kell átadni, ha a viselkedés számít.

Négy azonos hosszúságú változó kombinálásával létrehozhatunk egy adatkeretet R-ben az első adathalmazunkhoz.

# 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

output:

##     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

Minden vektor egy oszloppá, és az egyes vektorokban található négy értékből négy sor lett. Figyeljük meg, hogy az argumentumok névtelenek voltak, így az R az oszlopfejléceket magukból a változók nevéből származtatta.

Láthatjuk, hogy az oszlopfejlécek neve megegyezik a változókéval. Az oszlop nevét az R-ben a names() függvényekkel módosíthatjuk. Nézze meg az R létrehozási adatkeret példáját alább:

# Name the data frame
names(df) <- c('ID', 'items', 'store', 'price')
df

output:

##   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

A names() függvénynek értékadáskor az összes fejléc egyszerre cserélődik, tehát a cserevektornak oszloponként pontosan egy bejegyzéssel kell rendelkeznie. Egyetlen oszlop átnevezéséhez indexelni kell a names vektort, ahogy a names(df)[2] <- 'termék' példában látható.

# Print the structure
str(df)

output:

## '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

Verzió megjegyzés. A fenti kimenet egy 4.0.0-nál régebbi R kiadáson készült, ahol a data.frame() alapértelmezés szerint karaktervektorokat faktorokká alakított, ezért a tételek négyszintű faktorként vannak jelentve. Az alap R dokumentáció rögzíti, hogy ez a gyárilag friss alapértelmezett érték. megváltozott stringsAsFactors = FALSE értékre az R 4.0.0 verzióbanUgyanennek a kódnak a jelenlegi kiadáson történő futtatása sima karakteroszlopként hagyja az elemeket, és az str() ehelyett chr értéket ír ki. Adja hozzá a stringsAsFactors = TRUE értéket a data.frame() híváshoz a kiíratott kimenet reprodukálásához, vagy olvassa be a tényező bemutató amikor ténylegesen szükség van a tényezőkre.

Adatkeret szeletelése

Miután a keret elkészült, a következő feladat az egyes részeinek kihúzása. A szeletelés az R alapvető módja ennek, és ugyanazokat a szögletes zárójeleket használja, mint a vektorok, csak két pozícióval egy helyett.

Lehetséges egy adatkeret értékeit SZELETELNI. A visszaadandó sorokat és oszlopokat szögletes zárójelben, az adatkeret nevével megelőzve választjuk ki.

Egy adatkeret sorokból és oszlopokból áll, df[A, B]. A a sorokat, B pedig az oszlopokat jelöli. A sorok és/vagy oszlopok megadásával szeletelhetünk is.

Az alábbi 1. képen a bal oldali rész a következőt ábrázolja: sorok, a jobb oldali rész pedig a oszlopok. Vegye figyelembe, hogy a : szimbólum azt jelenti nak nek. Például az 1:3 az 1-ből kíván értékeket kiválasztani nak nek 3.

R adatkeret szeletelési szintaxis df[A, B], ahol a sorok a vessző bal oldalán, az oszlopok pedig a jobb oldalán helyezkednek el

Az alábbi ábrán bemutatjuk, hogyan férhet hozzá az adatkeret különböző elemeihez:

Színes nyilak egy R adatkeret felett, amelyek egyetlen cella, sortartomány, teljes oszlop és blokk kijelölését mutatják

  • A sárga nyíl kiválasztja a sor 1 in oszlop 2
  • A zöld nyíl kiválasztja a sorok 1 a 2
  • A piros nyíl kiválasztja a oszlop 1
  • A kék nyíl kiválasztja a sorok 1 és 3 és oszlopok 3 a 4

Megjegyzendő, hogy ha a bal oldali részt üresen hagyjuk, R kiválasztja az összes sor. Hasonlóan, ha a jobb oldali részt üresen hagyjuk, R kiválasztja az összes oszlopot.

A kódot a konzolban futtathatjuk:

## Select row 1 in column 2
df[1,2]

output:

## [1] book
## Levels: book pen pencil_case textbook

A Levels sor azért jelenik meg, mert az elemek szerepet játszanak ebben a munkamenetben. Az R 4.0.0 és újabb verziókban ugyanaz a hívás egyetlen „book” karakterláncot nyomtatja ki Levels sor nélkül.

## Select Rows 1 to 2
df[1:2,]

output:

##   ID items store price
## 1 10  book  TRUE   2.5
## 2 20   pen FALSE   8.0
## Select Columns 1
df[,1]

output:

## [1] 10 20 30 40

Egyetlen oszlop kiválasztása a df[,1] függvénnyel elveti a keretburkolót, és egy sima vektort ad vissza. Adjuk hozzá a drop = FALSE függvényt, ahogy a df[, 1, drop = FALSE] esetben, ha egyoszlopos adatkeretre van szükség.

## Select Rows 1 to 3 and columns 3 to 4
df[1:3, 3:4]

output:

##   store price
## 1  TRUE   2.5
## 2 FALSE   8.0
## 3  TRUE  10.0

Az oszlopok nevükkel is kijelölhetők. Például az alábbi kód így néz ki:trackét oszlopot tartalmaz: ID és store.

# Slice with columns name
df[, c('ID', 'store')]

output:

##   ID store
## 1 10  TRUE
## 2 20 FALSE
## 3 30  TRUE
## 4 40 FALSE

A nevek biztonságosabbak, mint a pozíciók az éles kódban, mivel egy oszlop beszúrása vagy átrendezése csendben megváltoztatja, hogy mire hivatkozik a df[, 3], miközben a df[, 'store'] továbbra is ugyanarra az adatra mutat.

Oszlop hozzáfűzése az adatkerethez

Oszlopot is hozzáfűzhetsz egy adatkerethez. Az R-ben a $ szimbólummal kell elnevezést végezned az új változóhoz, és hozzá kell adnod egy oszlopot egy adatkerethez.

# Create a new vector
quantity <- c(10, 35, 40, 5)

# Add `quantity` to the `df` data frame
df$quantity <- quantity
df

output:

##   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

Megjegyzés: A vektor elemszámának meg kell egyeznie az adatkeret elemszámával. Az alábbi utasítás végrehajtásával adjunk hozzá egy oszlopot az adatkerethez R-ben:

quantity <- c(10, 35, 40)
# Add `quantity` to the `df` data frame
df$quantity <- quantity

Hibát ad:

Error in `

lt;-.data.frame`(`*tmp*`, quantity, value = c(10, 35, 40))
replacement has 3 rows, data has 4

Az üzenet megnevezi az adatkeretekhez tartozó csereoperátort, és megadja mindkét darabszámot, így pontosan megmondja, hogy mit kell javítani. Az R csak akkor újrahasznosítja a csereoperátort, ha annak hossza egyenletesen osztja el a sorok számát, ezért fogad el egy 1-es hosszúságú értéket, például a df$currency <- 'EUR', míg egy 3-as hosszúságú vektort négy sorral szemben elutasít. A cbind() ugyanígy ad hozzá egy oszlopot, az rbind() pedig a sorok hozzáadásához szükséges megfelelője.

Válassza ki az adatkeret oszlopát

Előfordulhat, hogy egy adatkeret egy oszlopát későbbi felhasználásra tárolnunk kell, vagy műveletet kell végrehajtanunk egy oszlopon. A $ jellel jelölhetjük ki az oszlopot egy adatkeretből.

# Select the column ID
df$ID

output:

## [1] 1 2 3 4

Figyelmesen olvasd el a kimenetet. Az azonosítót a c(10, 20, 30, 40) vektorból állítottuk elő, így egy élő konzol itt 10 20 30 40-et ír ki; a fent látható 1 2 3 4 sorpozíciókat jelöl, nem pedig a tárolt értékeket. A sor elején lévő [1] egyszerűen a sor első elemének indexe, nem az adat része.

Három útvonal éri el ugyanazt az oszlopot: a df$ID, a df[['ID']] és a df[, 'ID']. A dollárjel részleges egyezést végez, így a df$I továbbra is megtalálja az ID-t, ami kényelmes a konzolon, de kockázatos egy mentett szkriptben.

Adatkeret részhalmaza

Az előző részben egy teljes oszlopot jelöltünk ki feltétel nélkül. Lehetséges részhalmaza az alapján, hogy egy bizonyos feltétel igaz-e vagy sem.

A subset() függvényt használjuk.

subset(x, condition)
arguments:
- x: data frame used to perform the subset
- condition: define the conditional statement

Csak az 5 feletti árat tartalmazó termékeket szeretnénk visszaküldeni, ezért a következőket tehetjük:

# Select price above 5
subset(df, subset = price > 5)

output:

ID       items store price
2 20         pen FALSE     8
3 30    textbook  TRUE    10
4 40 pencil_case FALSE     7

A 2., 3. és 4. sorcímkék az eredeti sornevek, amelyeket a df függvényből vettünk át, innen látszik, hogy az első sort kiszűrtük. A subset() függvény elfogad egy select argumentumot is az oszlopok egyidejű kiválasztásához, és az ezzel egyenértékű zárójeles alak a df[df$price > 5, ]. A zárójeles alak megtartja azokat a sorokat, amelyekben hiányzik a feltétel, míg a subset() elhagyja azokat, így a kettő nem mindig felcserélhető.

GYIK

Használd az rbind(df, new_row) függvényt, ahol a new_row egy adatkeret vagy lista, amelyben ugyanazok az oszlopok vannak ugyanabban a sorrendben. Az oszloptípusoknak egyezniük kell, különben az R kényszeríti őket. Sok sor esetén először egy listát kell létrehozni, és egyszer összevonni, mert az ismételt rbind() hívások lassúak.

Rendelj hozzá NULL értéket, ahogy a következőképpen: df$quantity <- NULL. A negatív indexelés is működik: df[, -3] elveti a harmadik oszlopot, és df[, !names(df) %in% c("store")] eltávolítja az oszlopokat név szerint, pozíciójuktól függetlenül.

A dim(df) a sorokat és oszlopokat együtt adja vissza, míg az nrow() és ncol() külön-külön. Az str(df) kinyomtatja az összes oszlop típusát, a summary(df) oszloponkénti statisztikákat ad, a head(df) pedig az első hat sort mutatja.

Indexeld a névvektort: ​​names(df)[2] <- "product" csak a második fejlécet változtatja meg. Az aktuális név szerinti átnevezéshez használd a names(df)[names(df) == "items"] <- "product" képletet, amely az oszlopsorrend megváltozása után is működik.

A tibble a tidyverse adatkerete. Soha nem konvertál karakterláncokat tényezőkké, soha nem illeszti részlegesen az oszlopneveket, csak az első tíz sort írja ki az oszloptípusokkal, és mindig tibble-t ad vissza, ha a részhalmaz egyetlen zárójelben van.

filter(df, ár > 5) a dplyr ezzel egyenértékű, és a select(), mutate() és arrange() függvénnyel láncban működik a pipe-on keresztül. A subset()-tel ellentétben a filter() programozott használatra készült, így függvényeken belül kiszámíthatóan viselkedik.

Az AI asszisztensek beolvassák az str() és a summary() kimenetét, majd típuskonverziókat, hiányzó értékekre vonatkozó stratégiákat és oszlopátnevezéseket javasolnak futtatható kódként. Emellett elmagyarázzák a titkosított csere hibáit is, bár minden generált transzformációt ellenőrizni kell a valós adatokkal szemben.

Igen. GitHub másodpilóta befut RStudio 2023.09.0 és újabb verziók az Eszközök, Globális beállítások, majd a Kódsegéd beállításain keresztül. Megjegyzésből készíti a data.frame(), subset() és rbind() hívásokat, de az oszlopneveket ellenőrizni kell.

Foglald össze ezt a bejegyzést a következőképpen: