变量数据结构和基本操作
在 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"