跳转至内容

R 编程/数据类型

来自 Wikibooks,开放世界中的开放书籍


数据类型

[编辑 | 编辑源代码]

向量(Vectors)是 R 中最简单的对象,一个给定类型(例如实数、字符串、逻辑值)的原始 R 对象的有序列表。向量由从 1 开始的整数索引。因子(Factors)类似于向量,但每个元素都是分类的,即固定数量的可能性之一(或水平(levels))。矩阵(Matrix)类似于向量,但具有特定的布局指令,使其看起来像一个矩阵,即元素由两个整数索引,每个整数都从 1 开始。数组(Arrays)类似于矩阵,但可以具有超过 2 个维度。列表(List)类似于向量,但元素不必都属于同一类型。列表的元素可以通过整数或命名字符串进行索引,即 R 列表可以用来实现其他语言中所谓的“关联数组”、“哈希表”、“映射”或“字典”。数据框(Dataframe)类似于矩阵,但不假设所有列都具有相同的类型。数据框是相同长度的变量/向量的列表。类(Classes)定义了特定类型对象(objects)的外观。作为属性(attribute)附加到对象。所有 R 对象都具有类、类型和维度。

> class(object)
> typeof(object)
> dim(object)

您可以使用c()函数创建向量,该函数连接一些元素。您可以使用:符号或seq()函数创建序列。例如1:5给出 1 到 5 之间的所有数字。该seq()函数允许您指定连续数字之间的间隔。您还可以使用rep()函数重复模式。您还可以使用numeric()创建缺失值的数值向量,使用character()创建缺失值的字符向量,以及使用FALSE的逻辑向量创建缺失值(即)logical()

> c(1,2,3,4,5)
[1] 1 2 3 4 5
> c("a","b","c","d","e")
[1] "a" "b" "c" "d" "e"
> c(T,F,T,F)
[1]  TRUE FALSE  TRUE FALSE

> 1:5
[1] 1 2 3 4 5
> 5:1
[1] 5 4 3 2 1
> seq(1,5)
[1] 1 2 3 4 5
> seq(1,5,by=.5)
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> rep(1,5)
[1] 1 1 1 1 1
> rep(1:2,5)
 [1] 1 2 1 2 1 2 1 2 1 2
> numeric(5)
[1] 0 0 0 0 0
> logical(5)
[1] FALSE FALSE FALSE FALSE FALSE
> character(5)
[1] "" "" "" "" ""

length()计算向量的长度。last()(sfsmisc) 返回向量的最后一个元素,但这也可以在无需额外包的情况下简单地实现。

x <- seq(1,5,by=.5)    # Create a sequence of number
x                      # Display this object
 [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> length(x)            # Get length of object x
 [1] 9
> library(sfsmisc)
> last(x)              # Select the last element of x  
 [1] 5.0
> x[length(x)]         # Select the last element wihout an extra package.
 [1] 5.0

factor()将向量转换为因子。因子也可以使用选项进行排序ordered=T或函数ordered(). levels()返回因子的水平。gl()生成因子。n是水平的数量,k每个因子的重复次数,以及length因子的总长度。labels是可选的,并为每个水平提供标签。

因子最容易被认为是分类变量。因子分析的一个重要函数是table()函数,它提供了一种摘要类型。在考虑统计数据类型(名义、有序、区间和比率)时,因子可以是名义、有序或区间。名义因子是分类名称,例如与某些其他信息配对的国家名称。有序因子的一个例子是特定运动员的一组比赛时间,以及与运动员的完成位置(第一名、第二名等)配对。在尝试总结此因子时,请参阅下面关于有序示例的示例,了解有关自行排序因子的示例。最后,区间级因子的一个示例是年龄组,例如“20-29”、“30-39”等。通常,R 可以自动适当地对存储为因子的数字进行排序,但程序员可以使用相同的方法处理此类数据,以使其以最适合其应用程序的方式进行排序。

另请参阅is.factor(), as.factor(), is.ordered()as.ordered().

 
> factor(c("yes","no","yes","maybe","maybe","no","maybe","no","no"))
[1] yes   no    yes   maybe maybe no    maybe no    no   
Levels: maybe no yes
> 
> factor(c("yes","no","yes","maybe","maybe","no","maybe","no","no"), ordered = T)
[1] yes   no    yes   maybe maybe no    maybe no    no   
Levels: maybe < no < yes
> 
> ordered(c("yes","no","yes","maybe","maybe","no","maybe","no","no"))
[1] yes   no    yes   maybe maybe no    maybe no    no   
Levels: maybe < no < yes
>
> ordered(as.factor(c("First","Third","Second","Fifth","First","First","Third")),
+ levels = c("First","Second","Third","Fourth","Fifth"))
[1] First  Third  Second Fifth  First  First  Third 
Levels: First < Second < Third < Fourth < Fifth
>
>  gl(n=2, k=2, length=10, labels = c("Male", "Female")) # generate factor levels
 [1] Male   Male   Female Female Male   Male   Female Female Male   Male  
Levels: Male Female
  • 如果要创建一个新矩阵,一种方法是使用matrix()函数。您必须输入一个数据向量、行数和/或列数,最后您可以指定是否希望 R 按行或按列读取您的向量(默认选项)。以下为两个示例。
> matrix(data = NA, nrow = 5, ncol = 5, byrow = T)
     [,1] [,2] [,3] [,4] [,5]
[1,]   NA   NA   NA   NA   NA
[2,]   NA   NA   NA   NA   NA
[3,]   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA
[5,]   NA   NA   NA   NA   NA
> matrix(data = 1:15, nrow = 5, ncol = 5, byrow = T)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15
[4,]    1    2    3    4    5
[5,]    6    7    8    9   10
  • 函数cbind()rbind()模式将向量组合成矩阵
> v1 <- 1:5
> v2 <- 5:1
> v2
[1] 5 4 3 2 1
> cbind(v1,v2)
     v1 v2
[1,]  1  5
[2,]  2  4
[3,]  3  3
[4,]  4  2
[5,]  5  1

> rbind(v1,v2)
   [,1] [,2] [,3] [,4] [,5]
v1    1    2    3    4    5
v2    5    4    3    2    1
  • 可以使用dim()函数获取矩阵的维度。或者nrow()ncol()返回矩阵中的行数和列数
> X <- matrix(data = 1:15, nrow = 5, ncol = 5, byrow = T)
> dim(X)
[1] 5 5
> nrow(X)
[1] 5
> ncol(X)
[1] 5
  • 函数t()转置矩阵
> t(X)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11    1    6
[2,]    2    7   12    2    7
[3,]    3    8   13    3    8
[4,]    4    9   14    4    9
[5,]    5   10   15    5   10
  • 与数据框不同,矩阵必须是数值型或字符型。
> a=matrix(2,2,2)
> a
     [,1] [,2]
[1,]    2    2
[2,]    2    2
> a = rbind(a,c("A","A"))
> a
     [,1] [,2]
[1,] "2"  "2" 
[2,] "2"  "2" 
[3,] "A"  "A"

数组由 n 个维度组成,每个维度都是相同类型 R 对象的向量。可以如下构造一个具有一个元素的一维数组。

> x <- array(c(T,F),dim=c(1))
> print(x)
[1] TRUE

数组 x 是使用从可能值向量 c(T,F) 中提取的单个维度 (dim=c(1)) 创建的。可以使用单个维度和两个值创建类似的数组 y。

> y <- array(c(T,F),dim=c(2))
> print(y)
[1]  TRUE FALSE

可以如下创建三维数组 - 3x3x3 -。

> z <- array(1:27,dim=c(3,3,3))
> dim(z)
[1] 3 3 3
> print(z)
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18

, , 3

     [,1] [,2] [,3]
[1,]   19   22   25
[2,]   20   23   26
[3,]   21   24   27

R 数组的访问方式类似于其他语言中的数组:通过整数索引,从 1 开始(而不是 0)。以下代码显示了如何访问 3x3x3 数组的第三个维度。第三个维度是一个 3x3 数组。

> z[,,3]
     [,1] [,2] [,3]
[1,]   19   22   25
[2,]   20   23   26
[3,]   21   24   27

指定三个维度中的两个会返回一个一维数组。

> z[,3,3]
[1] 25 26 27

指定三个维度中的三个会返回 3x3x3 数组的一个元素。

> z[3,3,3]
[1] 27

可以进行更复杂的数组分区。

> z[,c(2,3),c(2,3)]
, , 1

     [,1] [,2]
[1,]   13   16
[2,]   14   17
[3,]   15   18

, , 2

     [,1] [,2]
[1,]   22   25
[2,]   23   26
[3,]   24   27

数组不必在所有维度上都是对称的。以下代码创建了一对 3x3 数组。

> w <- array(1:18,dim=c(3,3,2))
> print(w)
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18

组成数组的向量的对象必须是相同类型,但不必是数字。

> u <- array(c(T,F),dim=c(3,3,2))
> print(u)
, , 1

      [,1]  [,2]  [,3]
[1,]  TRUE FALSE  TRUE
[2,] FALSE  TRUE FALSE
[3,]  TRUE FALSE  TRUE

, , 2

      [,1]  [,2]  [,3]
[1,] FALSE  TRUE FALSE
[2,]  TRUE FALSE  TRUE
[3,] FALSE  TRUE FALSE


列表是 R 对象的集合。list()创建列表。unlist()将列表转换为向量。列表中的对象不必具有相同的类型或长度。

> x <- c(1:4)
> y <- FALSE
> z <- matrix(c(1:4),nrow=2,ncol=2)
> myList <- list(x,y,z)
> myList
 [[1]]
[1] 1 2 3 4

 [[2]]
[1] FALSE

 [[3]]
     [,1] [,2]
[1,]    1    2
[2,]    3    4

列表具有非常灵活的引用方法

  • 按索引号
> a <- list()
> a
list()
> a[[1]] = "A"
> a
[[1]]
[1] "A"

> a[[2]]="B"
> a
[[1]]
[1] "A"

[[2]]
[1] "B"
  • 按名称
> a
list()
> a$fruit = "Apple"
> a
$fruit
[1] "Apple"

> a$color = "green"
> a
$fruit
[1] "Apple"

$color
[1] "green"
  • 这也可以是递归的,并且可以组合使用
> a = list()
> a[[1]] = "house"
> a$park = "green's park"
> a
[[1]]
[1] "house"

$park
[1] "green's park"


> a$park = "green's park"
> a[[1]]$address = "1 main st."

> a
[[1]]
[[1]][[1]]
[1] "house"

[[1]]$address
[1] "1 main st."


$park
[1] "green's park"

使用 R 中的作用域规则,还可以动态命名和创建列表元素

>  a <- list()
>  n <- 1:10
>  fruit = paste("number of coconuts in bin",n)
> my.number = paste("I have",10:1,"coconuts")
> for (i in 1:10)a[fruit[i]] = my.number[i]
>  a$'number of coconuts in bin 7'
[1] "I have 4 coconuts"

数据框

[编辑 | 编辑源代码]

数据框被称为“相同长度的变量/向量的列表”。在以下示例中,创建了一个由两个向量组成的数据框,每个向量有五个元素。第一个向量 v1 由 1 到 5 的整数序列组成。第二个向量 v2 由五种类型的 T 和 F 逻辑值组成。然后创建数据框,由这些向量组成。可以使用整数下标或列名称和$符号访问数据框的列。

> v1 <- 1:5
> v2 <- c(T,T,F,F,T)
> df <- data.frame(v1,v2)
> print(df)
  v1    v2
1  1  TRUE
2  2  TRUE
3  3 FALSE
4  4 FALSE
5  5  TRUE
> df[,1]
 [1] 1 2 3 4 5
> df$v2
 [1] TRUE TRUE FALSE FALSE TRUE

可以直接创建数据框。在以下代码中,创建数据框 - 将组成数据框的每个向量命名为参数列表的一部分。

> df <- data.frame(foo=1:5,bar=c(T,T,F,F,T))
> print(df)
  foo   bar
1   1  TRUE
2   2  TRUE
3   3 FALSE
4   4 FALSE
5   5  TRUE
[编辑 | 编辑源代码]



上一页:示例会话 索引 下一页:设置
华夏公益教科书