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