R语言的基本对象
1.R语言的向量对象
向量是用于存储数值型、字符型或逻辑型数据的一维数组。
R语言中建立一个向量的函数是c(),
例如:
c(1,2,3,4),结果是[1] 1 2 3 4
此外,也可以用c()函数建立字符向量,
例如:
c(“hello”, “world!”),结果是[1] “hello” “world!”
当向其中输入包含数值和字符串时,则该函数会默认地将数值转换为字符串。例如,在R语言中使用c(1.5, 'a')时的结果为一个混合类型的向量:'1.5' 和 'a'。
使用str()函数察看结果的类型,也表明结果是字符串类型的向量:
str(c(1.5,’a’))
chr [1:2] “1.5” “a”
由此我们可以知道:同一个向量中无法混杂不同格式的数据。
tip:建议不要使用R的内置函数名,如c作为变量,以避免混淆
除了c函数,我们也可以使用冒号:创建一个规则的向量,
比如:
创建1:6的向量,增量为1
1:6
[1] 1 2 3 4 5 66:1
[1] 6 5 4 3 2 1
R语言中,可以用等号或者箭头给变量赋值:
a=c(1,2,3)
a
[1] 1 2 3b<-c(1,2,3)
b
[1] 1 2 3
也可以
c(1,2,3)->b
b
[1] 1 2 3
tip:rstudio中可以用快捷键alt+- 键入箭头符号
请注意:在R中使用=进行对象赋值是被允许的。然而,在实际应用中发现采用这种方式编写的R程序并不少见。由于这不是标准的语法结构,在某些特定情况下使用等号进行赋值可能会导致问题。一些熟悉标准编程语言的R程序员可能会用这种方式取笑你。另外一种方式是将赋值方向反转。例如,在上述两种方式中选择一种更为合适。
向量的四则运算
向量之间可以直接进行加减乘除运算:
如:
c(1,2,3,4)+c(5,6,7,8)
[1] 6 8 10 12c(1,2,3,4)-c(5,6,7,8)
[1] -4 -4 -4 -4c(1,2,3,4)*c(5,6,7,8)
[1] 5 12 21 32
当两个长度不同的向量进行相加运算时,则会导致较短的向量被循环使用若干次以匹配较长向量的要求。例如,在以下示例中可以看到这一过程:
c(1,2,3,4)+c(5,6)
[1] 6 8 8 10
执行长短不一的向量加减运算时,默认要求长向量其模长应为短向量模长的整数倍;若不符合这一条件将会触发警告信息:
c(1,2,3,4)+c(5,6,7)
[1] 6 8 10 9
警告信息:
In c(1, 2, 3, 4) + c(5, 6, 7) : 长的对象长度不是短的对象长度的整倍数
向量的比较
除了四则运算之外,在进行向量间的大小比较时也会得到一个逻辑型向量。
c(2,3,4,5)>c(1,4,5,3)
[1] TRUE FALSE FALSE TRUE
向量元素的访问
在R语言中使用方括号中的数字来获取向量中对应的位置成员。值得注意的是,在R语言与常见的编程语言如C、Java不同之处在于其数组成员是从位置1开始计数。
a <- c(1,2,3,4)
a[1]
[1] 1
当然,如果我们不需要某个元素还可以这样:
a[-2]
[1] 1 3 4
第二个元素就被丢掉了,如果想丢掉多个,可以这样:
a[c(-1,-3)]
[1] 2 4
这样,第一个和第三个元素都被丢掉了。
2.R语言的矩阵对象
矩阵是由二维数组构成的。所有元素均具有相同的数据显示类型。在R语言中通过调用matrix函数来生成一个矩阵。
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
在参数设置中,在数据框中输入矩阵形式的数据。其中,
- data代表输入的矩阵元素;
- nrow表示输入矩阵的行数;
- ncol表示输入矩阵的列数;
- byrow用来决定数据填入的方向;
- 缺省设置为按照列方向填入;
- dimnames定义每一维的名字。
例1:
m1 <- matrix(1:20,nrow=5,ncol=4) #创建5x4的矩阵,按列填充
m1
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
例2:
cell <- c(1,2,3,4)
rnames <- c(“R1”, “R2”) #行名为”R1”, “R2”
cnames <- c(“C1”, “C2”) #列名为”C1”, “C2”
m2 <- matrix(cell, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames)) #2x2,按行填充m2
C1 C2
R1 1 2
R2 3 4
R语言中可以使用方括号+下标来选择矩阵中的行、列或元素。
如:
m1[1,] #m1矩阵的第一行
[1] 1 6 11 16m1[,1] #m1矩阵的第一列
[1] 1 2 3 4 5
这样做返回的结果是一个向量对象,在通常情况下我们希望保持矩阵格式不被丢失时,则可以适当设置相关参数以维持输出结果的形式完整性:
m1[,1,drop=F]
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5m1[3,4] #m1第3行,第4列元素
[1] 18
当然,也可以同时选择多行或者多列
m1[,c(2,3)] #同时选择第2列和第3列
[,1] [,2]
[1,] 6 11
[2,] 7 12
[3,] 8 13
[4,] 9 14
[5,] 10 15
使用dim函数可以很方便地查询矩阵的维度:
dim(m1)
[1] 5 4
3.R语言的数组对象
数组与矩阵类似,但是维度可以大于2。数组由array()函数创建,形式如下:
array(data = NA, dim = length(data), dimnames = NULL)
其中data字段表示数组中的数据信息。dim参数是一个数值型向量,用于指定各维度的最大索引值。dimnames参数可选提供各维度名称标签。
例子:
dim1 <- c(“A1”, “A2”)
dim2 <- c(“B1”, “B2”, “B3”)
dim3 <- c(“C1”, “C2”, “C3”, “C4”)
z <- array(1:24, c(2,3,4), dimnames=list(dim1,dim2,dim3))
z
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
z[1,2,3] #A1,B2,C3
[1] 15
4.R语言的数据框对象
在R语言中常用作数据存储的主要结构,在各个列能够容纳不同类型的数据的情况下更加普遍地被应用。这些数据集在SAS、SPSS以及Stata等软件中的呈现形式相似,在Python环境中则有其独特的实现方式。
mydata<-data.frame(col1, col2, …)
其中的列向量col1,2,…可以为任何类型。每一列的名称可由函数names指定。
例:
patientID <- c(1,2,3,4)
age <- c(25,34,28,52)
diabetes <- c(“Type1”, “Type2”, “Type1”, “Type1”)
status <- c(“Poor”, “Improved”, “Excellent”, “Poor”)
patientData <- data.frame(patientID, age, diabetes, status)
patientData
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
•选取数据框中的数据patientData[1:2] #选择数据框的前2列
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
也可以用变量名来选择数据,如:
patientData[c(“diabetes”, “status”)]
diabetes status
1 Type1 Poor
2 Type2 Improved
3 Type1 Excellent
4 Type1 Poor
除此之外还可以从数据框中提取特定的字段 除了使用符号$外 你可以通过以下方式操作 想要了解糖尿病类型变量diabetes与病情变量status之间的关联性 可以参考下述代码块
table(patientDatadiabetes, patientDatastatus)
Excellent Improved Poor
Type1 1 0 2
Type2 0 1 0
每次调用variableName时都必须输入once patientData显得较为繁琐。可以通过调用函数attach和detach或者单独调用with函数来简化代码。
该函数通过调用指定的数据框增加至工作环境中。当R识别一个变量名时会查找其所在的搜索路径中的相关数据框。
使用attach函数将数据框patientData加入搜索路径:
install(patientData)
The variables age, diabetes, patientID, and status are confounded with the '.GlobalEnv' namespace.
接着就可以直接引用patientData的变量了:
age
[1] 25, 34, 28, 52
diabetes
[1] “非典型性截瘫”, “典型性截瘫”, “非典型性截瘫”, “非典型性截瘫”
patientID
[1] 1, 2, 3, 4
status
[1] “Poor”, “Improved”, “Excellent”, “Poor”
请注意,在我们的环境中如果存在与数据框中某个变量相同名称的变量时,原始变量将获得优先权。无论什么情况下,请务必警惕那些提示某个对象已被屏蔽的通知。
5.R语言中的列表对象
在R语言的数据类型体系中,列表是最为复杂的代表形式之一;这种数据类型的特征是一个有序集合的整体结构;可以利用list()函数来生成这样的数据容器:
mylist <- list(object1, object2,…)
其中的对象可以是上面提到的任何结构。还可以为列表中的对象命名:
mylist <- list(name1=object1, name2=object2,…)
例:
g ← "the initial list"
h → a vector comprising the numbers 25 through 39
j → a matrix structure with 10 elements arranged into 5 rows
k → The labels 'one', 'two', and 'three' are assigned to elements in a vector
mylist → A collection of attributes including the title (g), age data (h), a matrix structure (j), and character labels (k) is compiled into mylist
The constructed object mylist contains these specified components
title
[1]”myfirstlist”
ages
[1]25 26 15 39
[[3]]
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
[[4]]
[1] “one” “two” “three”
mylist[[2]] #输出第二个成分
[1] 25 26 15 39
或:
mylist[[“ages”]]
[1] 25 26 15 39
因为有两个原因,在R编程语言中列表被认定为一个核心数据结构。首先,在R编程语言中能够以一种直观的方式组织和重新调用无关信息。其次,在这些函数中通常会将结果存储为一个列表形式的数据对象。研究者在分析过程中是否需要提取哪些特定成分?
R语言不具备多行注释或块状注释功能。为了实现多行注释功能,所有代码行必须以#号开头。在调试过程中,如果需要忽略某些代码行,请将它们放置于if(FALSE){...}语句中。修改条件为TRUE即可让这段代码执行。
其他一些注意事项:
• 在某些编程语言中,默认情况下句号(.)不具有特殊意义;但像美元符号()在其他语言中则类似于句号的作用,在表示对象内部的特定字段时被使用。例如,在R语言中使用Ax表示数据框A中的变量x;
• 当将一个值赋给向量、矩阵、数组或列表中的一个未定义的位置时(即该位置当前不存在),R语言会自动扩展这个数据结构以容纳新值。
比如:
x <<- c(1:3)
x[8] <<- 10x
[1] 1 2 3 NA NA NA NA 10
• R中的标量以单元素向量的形式存在
• R中的索引从1开始
• 变量在首次赋值时即被创建
