變數資料結構和基本操作
在 R 中,使用命名資料結構來運算元據物件。物件的名稱可能被稱為變數,儘管該術語在官方 R 文件中沒有特定含義。R 名稱區分大小寫,可能包含字母數字字元(a-z
,A-z
,0-9
),點/句點(.
)和下劃線(_
)。要為資料結構建立名稱,我們必須遵循以下規則:
-
以數字或下劃線開頭的名稱(例如
1a
),或有效數字表示式的名稱(例如.11
),或帶有破折號(’ - ‘)或空格的名稱只能在引用時使用:`1a`
和`.11`
。名稱將使用反引號列印:list( '.11' ="a") #$`.11` #[1] "a"
-
可以自由使用字母數字字元,點和下劃線的所有其他組合,其中帶或不帶反引號的引用指向同一物件。
-
以
.
開頭的名稱被視為系統名稱,並且使用ls()
-function 並不總是可見。
變數名中的字元數沒有限制。
有效物件名稱的一些示例是:foobar
,foo.bar
,foo_bar
,.foobar
在 R 中,使用中綴賦值運算子 <-
為變數賦值。運算子 =
也可用於為變數賦值,但其正確用途是將值與函式呼叫中的引數名相關聯。請注意,省略運算子周圍的空格可能會給使用者造成混淆。表示式 a<-1
被解析為賦值(a <- 1
)而不是邏輯比較(a < -1
)。
> foo <- 42
> fooEquals = 43
所以 foo
被分配了 42
的值。在控制檯中輸入 foo
將輸出 42
,輸入 fooEquals
將輸出 43
。
> foo
[1] 42
> fooEquals
[1] 43
以下命令為名為 x
的變數賦值,並同時列印該值:
> (x <- 5)
[1] 5
# actually two function calls: first one to `<-`; second one to the `()`-function
> is.function(`(`)
[1] TRUE # Often used in R help page examples for its side-effect of printing.
也可以使用 ->
對變數進行賦值。
> 5 -> x
> x
[1] 5
>
資料結構的型別
R 中沒有標量資料型別。長度為 1 的向量就像標量一樣。
- 向量:原子向量必須是同類物件的序列:數字序列,或邏輯序列或字元序列。
v <- c(2, 3, 7, 10)
,v2 <- c("a", "b", "c")
都是向量。 - 矩陣:數字,邏輯或字元的矩陣。
a <- matrix(data = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), nrow = 4, ncol = 3, byrow = F)
。與向量一樣,矩陣必須由相同類別的元素組成。要從矩陣中提取元素,必須指定行和列:a[1,2]
返回[1] 5
,它是第一行,第二列的元素。 - 列表:不同元素的串聯
mylist <- list (course = 'stat', date = '04/07/2009', num_isc = 7, num_cons = 6, num_mat = as.character(c(45020, 45679, 46789, 43126, 42345, 47568, 45674)), results = c(30, 19, 29, NA, 25, 26 ,27) )
。從列表中提取元素可以通過名稱(如果列表已命名)或通過索引完成。在給定的示例中,mylist$results
和mylist[[6]]
獲得相同的元素。警告:如果你嘗試mylist[6]
,R 不會給你一個錯誤,但它會將結果作為列表提取。雖然允許使用mylist[[6]][2]
(它給你 19),但mylist[6][2]
會給你一個錯誤。 - data.frame:具有相等長度但(可能)不同型別的向量的列的物件。它們不是矩陣。
exam <- data.frame(matr = as.character(c(45020, 45679, 46789, 43126, 42345, 47568, 45674)), res_S = c(30, 19, 29, NA, 25, 26, 27), res_O = c(3, 3, 1, NA, 3, 2, NA), res_TOT = c(30,22,30,NA,28,28,27))
。列可以通過名稱exam$matr
,exam[, 'matr']
或通過索引exam[1]
,exam[,1]
讀取。也可以通過名稱exam['rowname', ]
或 indexexam[1,]
讀取行。資料幀實際上只是具有特定結構的列表(rownames-attribute 和等長元件)
常見操作和一些警示性建議
預設操作是逐個元素完成的。有關運算子優先順序的規則,請參見 ?Syntax
。大多數運算子(以及基數 R 中的其他函式)具有允許不等長的引數的迴圈規則。鑑於這些物件:
示例物件
> a <- 1
> b <- 2
> c <- c(2,3,4)
> d <- c(10,10,10)
> e <- c(1,2,3,4)
> f <- 1:6
> W <- cbind(1:4,5:8,9:12)
> Z <- rbind(rep(0,3),1:3,rep(10,3),c(4,7,1))
一些向量運算
> a+b # scalar + scalar
[1] 3
> c+d # vector + vector
[1] 12 13 14
> a*b # scalar * scalar
[1] 2
> c*d # vector * vector (componentwise!)
[1] 20 30 40
> c+a # vector + scalar
[1] 3 4 5
> c^2 #
[1] 4 9 16
> exp(c)
[1] 7.389056 20.085537 54.598150
一些向量操作警告!
> c+e # warning but.. no errors, since recycling is assumed to be desired.
[1] 3 5 7 6
Warning message:
In c + e : longer object length is not a multiple of shorter object length
R 總結它可以然後重新使用較短的向量來填充空白……僅僅因為兩個向量的長度不是精確的倍數而給出警告。c + f#沒有任何警告。
一些 Matrix 操作警告!
> Z+W # matrix + matrix #(componentwise)
> Z*W # matrix* matrix#(Standard product is always componentwise)
使用矩陣乘法:V%*%W
> W + a # matrix+ scalar is still componentwise
[,1] [,2] [,3]
[1,] 2 6 10
[2,] 3 7 11
[3,] 4 8 12
[4,] 5 9 13
> W + c # matrix + vector... : no warnings and R does the operation in a column-wise manner
[,1] [,2] [,3]
[1,] 3 8 13
[2,] 5 10 12
[3,] 7 9 14
[4,] 6 11 16
私人變數
R 中變數或函式名稱中的前導點通常用於表示變數或函式是隱藏的。
因此,宣告以下變數
> foo <- 'foo'
> .foo <- 'bar'
然後使用 ls
函式列出物件只會顯示第一個物件。
> ls()
[1] "foo"
但是,將 all.names = TRUE
傳遞給函式將顯示’private’變數
> ls(all.names = TRUE)
[1] ".foo" "foo"