变量数据结构和基本操作

在 R 中,使用命名数据结构来操作数据对象。对象的名称可能被称为变量,尽管该术语在官方 R 文档中没有特定含义。R 名称区分大小写,可能包含字母数字字符(a-zA-z0-9),点/句点(.)和下划线(_)。要为数据结构创建名称,我们必须遵循以下规则:

  • 以数字或下划线开头的名称(例如 1a),或有效数字表达式的名称(例如 .11),或带有破折号(’ - ‘)或空格的名称只能在引用时使用:`1a``.11`。名称将使用反引号打印:

     list( '.11' ="a")
     #$`.11`
     #[1] "a"
    
  • 可以自由使用字母数字字符,点和下划线的所有其他组合,其中带或不带反引号的引用指向同一对象。

  • . 开头的名称被视为系统名称,并且使用 ls()-function 并不总是可见。

变量名中的字符数没有限制。

有效对象名称的一些示例是:foobarfoo.barfoo_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$resultsmylist[[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$matrexam[, 'matr'] 或通过索引 exam[1]exam[,1] 读取。也可以通过名称 exam['rowname', ] 或 index exam[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"