R Language
Delin
Sök…
Introduktion
Med tanke på ett R-objekt kan vi kräva separat analys för en eller flera delar av informationen i den. Processen för att erhålla dessa delar av data från ett givet objekt kallas subsetting
.
Anmärkningar
Värden saknas:
Saknade värden ( NA
) används för att ställa in med [
returnera NA
sedan ett NA
index
väljer ett okänt element och returnerar så NA i motsvarande element ..
NA
standardtypen är "logisk" ( typeof(NA)
) vilket innebär att, liksom alla "logiska" vektorer som används i underinställningen, kommer att återvinnas för att matcha längden på det underinställda objektet. Så x[NA]
är ekvivalent med x[as.logical(NA)]
vilket motsvarar x[rep_len(as.logical(NA), length(x))]
och följaktligen returnerar det ett saknat värde ( NA
) för varje element i x
. Som ett exempel:
x <- 1:3
x[NA]
## [1] NA NA NA
När indexering med "numeriskt" / "heltal" NA
väljer ett enda NA
element (för varje NA
i index):
x[as.integer(NA)]
## [1] NA
x[c(NA, 1, NA, NA)]
## [1] NA 1 NA NA
Avsluta utanför gränserna:
[
Operatören, med ett argument godkänt, tillåter index som är > length(x)
och returnerar NA
för atomvektorer eller NULL
för generiska vektorer. I motsats till detta, med [[
och när [
skickas fler argument (dvs avgränsning av objekt med length(dim(x)) > 2
) returneras ett fel:
(1:3)[10]
## [1] NA
(1:3)[[10]]
## Error in (1:3)[[10]] : subscript out of bounds
as.matrix(1:3)[10]
## [1] NA
as.matrix(1:3)[, 10]
## Error in as.matrix(1:3)[, 10] : subscript out of bounds
list(1, 2, 3)[10]
## [[1]]
## NULL
list(1, 2, 3)[[10]]
## Error in list(1, 2, 3)[[10]] : subscript out of bounds
Uppträdandet är detsamma när du sätter ned med "tecken" -vektorer, som inte matchas i objektets "namn" -attribut:
c(a = 1, b = 2)["c"]
## <NA>
## NA
list(a = 1, b = 2)["c"]
## <NA>
## NULL
Hjälpsamma ämnen:
Se ?Extract
för mer information.
Atomvektorer
Atomvektorer (som utesluter listor och uttryck, som också är vektorer) delmängd med [
operatören:
# create an example vector
v1 <- c("a", "b", "c", "d")
# select the third element
v1[3]
## [1] "c"
[
Operatören kan också ta en vektor som argument. Till exempel för att välja det första och det tredje elementet:
v1 <- c("a", "b", "c", "d")
v1[c(1, 3)]
## [1] "a" "c"
Vissa gånger kan vi behöva utelämna ett visst värde från vektorn. Detta kan uppnås med ett negativt tecken ( -
) före indexet för det värdet. Till exempel, för att utelämna att utelämna det första värdet från v1, använd v1[-1]
. Detta kan utvidgas till mer än ett värde på ett rakt framåt sätt. Till exempel v1[-c(1,3)]
.
> v1[-1]
[1] "b" "c" "d"
> v1[-c(1,3)]
[1] "b" "d"
Vid vissa tillfällen vill vi veta, särskilt när vektorns längd är stor, index för ett visst värde, om det finns:
> v1=="c"
[1] FALSE FALSE TRUE FALSE
> which(v1=="c")
[1] 3
Om atom vektorn har namn (ett names
attribut), kan den delmängd med hjälp av en karaktär vektor namn:
v <- 1:3
names(v) <- c("one", "two", "three")
v
## one two three
## 1 2 3
v["two"]
## two
## 2
[[
Operatören kan också användas för att indexera atomvektorer, med skillnader i att den accepterar en indexeringsvektor med en längd på en och ränder alla närvarande namn:
v[[c(1, 2)]]
## Error in v[[c(1, 2)]] :
## attempt to select more than one element in vectorIndex
v[["two"]]
## [1] 2
Vektorer kan också delmängdas med en logisk vektor. I motsats till underinställning med numeriska och teckenvektorer, måste den logiska vektorn som används för att delmängden vara lika med längden på vektorn vars element extraheras, så om en logisk vektor y
används för att delmängden x
, dvs. x[y]
, om length(y) < length(x)
sedan återvinns y
till matchningslängd length(x)
:
v[c(TRUE, FALSE, TRUE)]
## one three
## 1 3
v[c(FALSE, TRUE)] # recycled to 'c(FALSE, TRUE, FALSE)'
## two
## 2
v[TRUE] # recycled to 'c(TRUE, TRUE, TRUE)'
## one two three
## 1 2 3
v[FALSE] # handy to discard elements but save the vector's type and basic structure
## named integer(0)
listor
En lista kan delas med [
:
l1 <- list(c(1, 2, 3), 'two' = c("a", "b", "c"), list(10, 20))
l1
## [[1]]
## [1] 1 2 3
##
## $two
## [1] "a" "b" "c"
##
## [[3]]
## [[3]][[1]]
## [1] 10
##
## [[3]][[2]]
## [1] 20
l1[1]
## [[1]]
## [1] 1 2 3
l1['two']
## $two
## [1] "a" "b" "c"
l1[[2]]
## [1] "a" "b" "c"
l1[['two']]
## [1] "a" "b" "c"
Observera att resultatet av l1[2]
fortfarande är en lista, eftersom [
operatören väljer element i en lista och returnerar en mindre lista. [[
Operatören extraherar listelement och returnerar ett objekt av listelementets typ.
Element kan indexeras efter nummer eller en teckensträng med namnet (om det finns). Flera element kan väljas med [
genom att passera en vektor med siffror eller namnsträngar. Indexering med en längdvektor length > 1
i [
och [[
returnerar en "lista" med de angivna elementen och en rekursiv underuppsättning (om tillgänglig), respektive :
l1[c(3, 1)]
## [[1]]
## [[1]][[1]]
## [1] 10
##
## [[1]][[2]]
## [1] 20
##
##
## [[2]]
## [1] 1 2 3
Jämfört med:
l1[[c(3, 1)]]
## [1] 10
vilket motsvarar:
l1[[3]][[1]]
## [1] 10
Operatören $
låter dig välja listelement enbart med namn, men till skillnad från [
och [[
, kräver inte offert [[
. Som infixoperatör kan $
bara ta ett enda namn:
l1$two
## [1] "a" "b" "c"
Dessutom tillåter operatören $
delvis matchning som standard:
l1$t
## [1] "a" "b" "c"
i motsats till [[
där det måste specificeras om partiell matchning är tillåten:
l1[["t"]]
## NULL
l1[["t", exact = FALSE]]
## [1] "a" "b" "c"
Inställningsalternativ options(warnPartialMatchDollar = TRUE)
, en "varning" ges när partiell matchning sker med $
:
l1$t
## [1] "a" "b" "c"
## Warning message:
## In l1$t : partial match of 't' to 'two'
matriser
För varje dimension av ett objekt tar [
operatören ett argument. Vektorer har en dimension och tar ett argument. Matriser och dataramar har två dimensioner och tar två argument, angivna som [i, j]
där i
är raden och j
är kolumnen. Indexering börjar 1.
## a sample matrix
mat <- matrix(1:6, nrow = 2, dimnames = list(c("row1", "row2"), c("col1", "col2", "col3")))
mat
# col1 col2 col3
# row1 1 3 5
# row2 2 4 6
mat[i,j]
är elementet i den i
rad, j
kolumnen i mat
. Till exempel ger ett i
värde på 2
och ett j
värde på 1
numret i den andra raden och den första kolumnen i matrisen. Om du utelämnar i
eller j
returneras alla värden i den dimensionen.
mat[ , 3]
## row1 row2
## 5 6
mat[1, ]
# col1 col2 col3
# 1 3 5
När matrisen har rad- eller kolumnnamn (krävs inte), kan dessa användas för att ställa in:
mat[ , 'col1']
# row1 row2
# 1 2
Som standard förenklas resultatet av en delmängd om möjligt. Om delmängden bara har en dimension, som i exemplen ovan, kommer resultatet att vara en endimensionell vektor snarare än en tvådimensionell matris. Detta standard kan åsidosättas med drop = FALSE
argumentet till [
:
## This selects the first row as a vector
class(mat[1, ])
# [1] "integer"
## Whereas this selects the first row as a 1x3 matrix:
class(mat[1, , drop = F])
# [1] "matrix"
Naturligtvis kan dimensioner inte släppas om själva markeringen har två dimensioner:
mat[1:2, 2:3] ## A 2x2 matrix
# col2 col3
# row1 3 5
# row2 4 6
Välja enskilda matrisposter efter sina positioner
Det är också möjligt att använda en Nx2-matris för att välja N enskilda element från en matris (som hur ett koordinatsystem fungerar). Om du ville extrahera, i en vektor, inmatningarna i en matris i (1st row, 1st column), (1st row, 3rd column), (2nd row, 3rd column), (2nd row, 1st column)
detta görs enkelt genom att skapa en indexmatris med de koordinaterna och använda den för att dela matrisen:
mat
# col1 col2 col3
# row1 1 3 5
# row2 2 4 6
ind = rbind(c(1, 1), c(1, 3), c(2, 3), c(2, 1))
ind
# [,1] [,2]
# [1,] 1 1
# [2,] 1 3
# [3,] 2 3
# [4,] 2 1
mat[ind]
# [1] 1 5 6 2
I exemplet ovan avser den första kolumnen i ind
rader i mat
, den andra kolumnen med ind
hänvisar till kolumner i mat
.
Dataramar
Att dela in en dataram i en mindre dataram kan åstadkommas på samma sätt som att lägga till en lista.
> df3 <- data.frame(x = 1:3, y = c("a", "b", "c"), stringsAsFactors = FALSE)
> df3
## x y
## 1 1 a
## 2 2 b
## 3 3 c
> df3[1] # Subset a variable by number
## x
## 1 1
## 2 2
## 3 3
> df3["x"] # Subset a variable by name
## x
## 1 1
## 2 2
## 3 3
> is.data.frame(df3[1])
## TRUE
> is.list(df3[1])
## TRUE
Att dela in ett dataframe i en kolumnvektor kan utföras med dubbla parenteser [[]] eller dollarteckenoperatören $.
> df3[[2]] # Subset a variable by number using [[ ]]
## [1] "a" "b" "c"
> df3[["y"]] # Subset a variable by name using [[ ]]
## [1] "a" "b" "c"
> df3$x # Subset a variable by name using $
## [1] 1 2 3
> typeof(df3$x)
## "integer"
> is.vector(df3$x)
## TRUE
Att dela in en data som en tvådimensionell matris kan åstadkommas med hjälp av i
och j
termer.
> df3[1, 2] # Subset row and column by number
## [1] "a"
> df3[1, "y"] # Subset row by number and column by name
## [1] "a"
> df3[2, ] # Subset entire row by number
## x y
## 2 2 b
> df3[ , 1] # Subset all first variables
## [1] 1 2 3
> df3[ , 1, drop = FALSE]
## x
## 1 1
## 2 2
## 3 3
Obs! Om du bara använder j
(kolumn) förenklas variabelns egen typ, men att dela med i
enbart ger en data.frame
, eftersom de olika variablerna kan ha olika typer och klasser. Inställning av drop
parametern till FALSE
håller dataramen.
> is.vector(df3[, 2])
## TRUE
> is.data.frame(df3[2, ])
## TRUE
> is.data.frame(df3[, 2, drop = FALSE])
## TRUE
Andra föremål
Operatörerna [
och [[
är primitiva funktioner som är generiska. Detta innebär att alla objekt i R (specifikt isTRUE(is.object(x))
--ie har ett uttryckligt "klass" -attribut) kan ha sitt eget angivna beteende när det ställs in; dvs. har sina egna metoder för [
och / eller [[
.
Till exempel är detta fallet med "data.frame" ( is.object(iris)
) -objekt där [.data.frame
och [[.data.frame
metoder är definierade och de är gjorda för att visa både "matrix" -liknande och "lista" -liknande underinställningar. Med att tvinga fram ett fel när du sätter ned en "data.frame" ser vi att en funktion [.data.frame
kallades när vi -just-använde [
.
iris[invalidArgument, ]
## Error in `[.data.frame`(iris, invalidArgument, ) :
## object 'invalidArgument' not found
Utan ytterligare detaljer om det aktuella ämnet, ett exempel [
metod:
x = structure(1:5, class = "myClass")
x[c(3, 2, 4)]
## [1] 3 2 4
'[.myClass' = function(x, i) cat(sprintf("We'd expect '%s[%s]' to be returned but this a custom `[` method and should have a `?[.myClass` help page for its behaviour\n", deparse(substitute(x)), deparse(substitute(i))))
x[c(3, 2, 4)]
## We'd expect 'x[c(3, 2, 4)]' to be returned but this a custom `[` method and should have a `?[.myClass` help page for its behaviour
## NULL
Vi kan övervinna metodförsändningen av [
genom att använda den ekvivalenta icke-generiska. .subset
(och .subset2
för [[
)). Detta är särskilt användbart och effektivt när du programmerar våra egna "klass" och vill undvika arbetsomgångar (som unclass(x)
) när du beräknar våra "klass" på ett effektivt sätt (undviker avsändning av metoder och kopierar objekt):
.subset(x, c(3, 2, 4))
## [1] 3 2 4
Vektorindex
I det här exemplet kommer vi att använda vektorn:
> x <- 11:20
> x
[1] 11 12 13 14 15 16 17 18 19 20
R-vektorer är 1-indexerade, så till exempel kommer x[1]
att returnera 11
. Vi kan också extrahera en delvektor av x
genom att överföra en vektor med index till konsolen operatör:
> x[c(2,4,6)]
[1] 12 14 16
Om vi passerar en vektor med negativa index kommer R att returnera en undervektor med de angivna indexen uteslutna:
> x[c(-1,-3)]
[1] 12 14 15 16 17 18 19 20
Vi kan också skicka en boolesk vektor till parentesoperatören, i vilket fall den returnerar en subvektor som motsvarar koordinaterna där indexeringsvektorn är TRUE
:
> x[c(rep(TRUE,5),rep(FALSE,5))]
[1] 11 12 13 14 15 16
Om indexeringsvektorn är kortare än arrayens längd kommer den att upprepas, som i:
> x[c(TRUE,FALSE)]
[1] 11 13 15 17 19
> x[c(TRUE,FALSE,FALSE)]
[1] 11 14 17 20
Elementvis matrisoperationer
Låt A och B vara två matriser med samma dimension. Operatörerna +
, -
, /
, *
, ^
när de används med matriser av samma dimension utför de erforderliga operationerna på motsvarande element i matriserna och returnerar en ny matris med samma dimension. Dessa operationer kallas vanligtvis elementvisa operationer.
Operatör | A op B | Menande |
---|---|---|
+ | A + B | Tillägg av motsvarande element i A och B |
- | A - B | Drar bort elementen i B från motsvarande element i A |
/ | A / B | Delar elementen i A med motsvarande element i B |
* | A * B | Multiplicerar elementen i A med motsvarande element i B |
^ | A ^ (- 1) | Ger till exempel en matris vars element är återkallande av A |
För "sann" matrismultiplikation, som framgår av Linear Algebra , använd %*%
. Exempelvis är multiplikation av A med B: A %*% B
Dimensionskraven är att ncol()
för A
är densamma som nrow()
för B
Några funktioner som används med matriser
Fungera | Exempel | Ändamål |
---|---|---|
nrow () | nrow (A) | bestämmer antalet rader av A |
Ncol () | Ncol (A) | bestämmer antalet kolumner i A |
rownames () | rownames (A) | skriver ut radnamnen på matrisen A |
colnames () | colnames (A) | skriver ut kolumnnamnen på matrisen A |
rowMeans () | rowMeans (A) | beräknar medel för varje rad i matrisen A |
colMeans () | colMeans (A) | beräknar medel för varje kolumn i matrisen A |
upper.tri () | upper.tri (A) | returnerar en vektor vars element är de övre |
triangulär matris av kvadratmatris A | ||
lower.tri () | lower.tri (A) | returnerar en vektor vars element är lägre |
triangulär matris av kvadratmatris A | ||
det () | det (A) | resulterar i determinanten för matrisen A |
lösa() | solve (A) | resulterar i det omvända av den icke singulära matrisen A |
diag () | diag (A) | returnerar en diagonal matris vars off-diagnostiska element är nollor och |
diagonalerna är desamma som för den fyrkantiga matrisen A | ||
t () | t (A) | returnerar transponering av matrisen A |
eigen () | eigen (A) | retuens egenvärdena och egenvektorerna i matrisen A |
is.matrix () | is.matrix (A) | returnerar SANT eller FALSE beroende på om A är en matris eller inte. |
as.matrix () | as.matrix (x) | skapar en matris ur vektorn x |