R语言入门系列文章目录

【R语言介绍】R与RStudio的安装、获取帮助、工作空间、输入和输出【创建数据集】变量、向量、矩阵、数组、数据框、因子、列表创建【R语言入门】创建数据集(二)【R语言入门】图形初阶【R语言入门】基本图形【R语言入门】基本统计分析


目录

  • R语言入门系列文章目录
  • 前言
  • 一.数据集的概念
  • 二.数据结构
  • 1.变量
  • 2.向量
  • 3.矩阵
  • 4.数组
  • 5.数据框
  • 6.因子
  • 7.列表
  • 总结
  • 写在最后



前言

本章内容
探索R的数据结构
输入数据
导入数据
标注数据

一.数据集的概念

数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。
R中有许多用于存储数据的结构,包括标量、向量、数据、数据框和列表。
R可以处理的数据类型包括数值型、字符型、逻辑型(TRUE、FALSE)、复数型(虚数)和原生型(字节)。

二.数据结构

R拥有许多存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。

在r语言中怎么从文件中的数据建一个数据集 r语言怎么创建数据集_数据


在R中,对象是指可以赋值给变量的任何事物,包括常量、数据结构、函数、甚至图形。

数据框是R中用于存储数据的一种结构:列表示变量,行表示观测。

注意:R语言中的下标从1开始!!!

1.变量

变量是存储数据的载体。可以通过<-=进行赋值,更常用的则是<-
变量可以有多种类型:

  • 数值(Numeric):如10,3,14,0.25等。
  • 字符(Character):如"a","results"等。
  • 因子(factors):定性变量和有序变量。
  • 逻辑符(Bool):有"TRUE"和"FLASE"。
  • 日期(Date)
> x <- 10
> x
[1] 10
> y <- "a"
> y
[1] "a"
> class(x)
[1] "numeric"
> class(y)
[1] "character"

2.向量

向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量。
注意:单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型),同一向量中无法混杂不同模式的数据。

> a <- c(1, 2, 5, 3, 6, -2, 4)
> a
[1]  1  2  5  3  6 -2  4
> b <- c("one", "two", "three")
> b
[1] "one"   "two"   "three"
> c <- c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE)
> c
[1]  TRUE  TRUE  TRUE FALSE FALSE  TRUE

标量是只含一个元素的向量,例如 f <-3g<-"US"。用于保存向量。

通过在方括号中给定元素所处位置的数值,我们可以访问向量中的元素。

> a <- c("k", "j", "h", "a", "c", "m")
> a[3]
[1] "h"
> a[c(1, 3, 5)]
[1] "k" "h" "c"
> a[2:6]
[1] "j" "h" "a" "c" "m"

3.矩阵

矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型),简单说是多个向量的集合。可通过函数matrix()创建矩阵。

myymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns,
                    byrow=logical_value, dimnames=list(
                    char_vector_rownames, char_vector_colnames))

vector包含了矩阵的元素。 nrow和ncol用以指定行和列的维数。
dimnames包含了可选的、以字符型向量表示的行名和列名。
byrow则表明矩阵应该按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充。

> y <- matrix(1:20, nrow=5, ncol=4) 
> y
     [,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
> cells <- c(1,26,24,68)
> rnames <- c("R1","R2")
> cnames <- c("C1","C2")
> mat <- matrix(cells, nrow=2, ncol=2, byrow = TRUE, dimnames = list(rnames, cnames))
> mat
   C1 C2
R1  1 26
R2 24 68

通过在方括号中给定元素所处位置的数值,我们可以访问矩阵中的元素。

> x <- matrix(1:10, nrow=2)
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
> x[2,]
[1]  2  4  6  8 10
> x[,2]
[1] 3 4
> x[1,4]
[1] 7
> x[1,c(4,5)]
[1] 7 9

4.数组

数组与矩阵类似,但是维度可以大于2。数组可以通过array()创建。

myarray <- array(vector, dimensions, dimnames)

vector包含了数组中的数据。
dimensions是一个数值型向量,给出了各个维度下标的最大值。
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]
[1] 15

5.数据框

由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更为一般。通常在SPSS和Stata中看到的数据集类似。数据框将是你在R中最常处理的数据结构。

数据框可通过函数data.frame()创建:

mydata <- data.frame(col1, co12, col3, ...)

其中,列向量col1, col2, col3等可以为任何类型(字符型、数值型、逻辑型)。每一列的名称可由函数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

实例标识符(类似索引,不能重复)
该数据中,patientID可用于区分数据集中不同的个体。
在R中实例标识符可通过数据框操作函数中的rowname选项指定。
将patientID指定为R中标记各类打印输出和图形中实例名称所用的变量。

# 实例标识符:patientID
> patientdata <- data.frame(patientID, age, diabetes, status, row.names=patientID)
> 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 <- data.frame(patientID, age, diabetes, status, row.names=age)
> # 实例标识符:age 
> patientdata
   patientID age diabetes    status
25         1  25    Type1      Poor
34         2  34    Type2  Improved
28         3  28    Type1 Excellent
52         4  52    Type1      Poor
> # 实例标识符:diabetes
> patientdata <- data.frame(patientID, age, diabetes, status, row.names=diabetes)
Error in data.frame(patientID, age, diabetes, status, row.names = diabetes) : 
  row.names有重复: Type1
>
> patientdata[1: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
> patientdata$age
[1] 25 34 28 52

$被用来选取一个给定数据框中的某个特定变量。例如生成diabetesstatus的列联表,可以表示为:

> table(patientdata$diabetes, patientdata$status)
       
        Excellent Improved Poor
  Type1         1        0    2
  Type2         0        1    0

此外,如果数据框中变量很多,总是使用$会很麻烦,所以我们可以将数据框添加到R的搜索路径中。可以联合使用函数attach()detach()或单独使用函数with()来简化代码。

以R自带的mtcars数据框为例:
mpg:每加仑行驶英里数。
disp:发动机排量。
wt:车身重量。

> summary(mtcars$mpg) #获取描述性统计量
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.40   15.43   19.20   20.09   22.80   33.90 
> plot(mtcars$mpg, mtcars$disp) # 绘制散点图
> plot(mtcars$mpg, mtcars$wt)

可更改为:

> attach(mtcars)
>     summary(mpg)
>     plot(mpg, disp)
>     plot(mpg, wt)
> detach(mtcars)
  • 函数attach()可将数据框添加到R的搜索路径中。
  • 函数detach()可将数据框从R的搜索路径中移除。

局限性:当名称相同的变量不止一个时,原始对象将取得优先权。

> mpg <- c(25, 36, 47)
> attach(mtcars) 
The following object is masked _by_ .GlobalEnv:

    mpg # mtcars中的mpg对象被屏蔽

> plot(mpg, disp) # 此时mpg中有3个元素,disp中有32个元素,所以报错
Error in xy.coords(x, y, xlabel, ylabel, log) : 
  'x' and 'y' lengths differ

还可更改为:

# 花括号{}之间的语句都是针对数据框mtcars执行。
# 若花括号{}仅有一条语句,则可以省略花括号。
> with(mtcars, { 
    print(summary(mpg))
    plot(mpg, disp)
    plot(mpg, wt)
})
  • 函数with()

局限性:赋值仅在此函数括号内生效,若需要创建with()结构之外存在的对象,使用特殊赋值符<<-替代标准赋值符<-,可将对象保存到with()之外的全局环境中

> with(mtcars, {
+     stats <- summary(mpg)
+     newstats <<- summary(mpg)
+ })
> stats
错误: 找不到对象'stats'
> newstats
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.40   15.43   19.20   20.09   22.80   33.90

6.因子

变量可归结为名义型、有序型或连续型变量。
名义型变量:没有顺序之分的类别变量。如Diabetes(Type1, Type2) 有序型变量:表示一种顺序关系,非数量关系。如Status(poor、improves、excellent) 连续型变量:可以呈现为某个范围内的任意值,并同时表示了顺序和数量。如Age(25、34、28、52)

类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。

函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1…k](其中k是名义型变量中唯一值的个数),同时由一个字符串(原始值)组成的内部向量将映射到这些整数上。

# 表示有序型变量,需要指定参数 ordered=TRUE
# 对于字符型向量,因子的水平默认依字母顺序创建,可以通过指定levels选项来覆盖默认排序。
# 数值型变量可以用levels和labels参数来编码成因子。如果男性被编码成1,女性被编码成2。标签顺序必须和水平相一致。否则为缺失值。
status <- factor(status, order=TRUE, levels=c("Poor", "Improved", "Excellent"))
sex <- factor(sex, levels=c(1,2), labels=("Male", "Female"))
> patientID <-c(1, 2, 3, 4)
> age <- c(25, 34, 28, 52)
> diabetes <- c("Type1","Type2","Type1","Type1")
> status <- c("Poor","Improved","Excellent","Poor")
> diabetes <- factor(diabetes)
> status <- factor(status, order=TRUE)
> patientdata <- data.frame(patientID, age, diabetes, status)
> str(patientdata)
'data.frame':	4 obs. of  4 variables:
 $ patientID: num  1 2 3 4
 $ age      : num  25 34 28 52
 $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1
 $ status   : Factor w/ 3 levels "Excellent","Improved",..: 3 2 1 3
        
> summary(patientdata)
   patientID         age         diabetes       status 
 Min.   :1.00   Min.   :25.00   Type1:3   Excellent:1  
 1st Qu.:1.75   1st Qu.:27.25   Type2:1   Improved :1  
 Median :2.50   Median :31.00             Poor     :2  
 Mean   :2.50   Mean   :34.75                          
 3rd Qu.:3.25   3rd Qu.:38.50                          
 Max.   :4.00   Max.   :52.00

7.列表

列表是R的数据类型中最为复杂的一种,列表就是一些对象的有序集合,可以是若干向量、矩阵、数据框,甚至其他列表的组合,可以使用函数list()创建列表。

mylist <- list(object1, object2, ...)

可以为列表的对象命名:

mylist <- list(name1=object1, name2=object2, ...)
> g <- "My First List"
> h <- c(25, 26, 18, 39)
> j <- matrix(1:10, nrow=5)
> k <- c("one", "two", "three")
> mylist <- list(title=g, ages=h, j, k)
> mylist
$title
[1] "My First List"

$ages
[1] 25 26 18 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 18 39
> mylist[["ages"]]
[1] 25 26 18 39
> mylist[2]
$ages
[1] 25 26 18 39

总结

R语言中对象名称中美元符号($)等价于其他语言的句点(.)。
R不提供多行注释或块注释的功能,可以将解释器忽略的代码放在语句if(Flase){…}中。
R中没有标量,标量以单元素向量的形式出现。
R的下标从1开始,不是从0开始。
将一个值赋给某个向量、矩阵、数组或列表中一个不存在的元素,R将自动扩展这个数据结构容纳新值而不会报错。

> x <- c(8, 6, 4)
> x[7] <- 10
> x
[1]  8  6  4 NA NA NA 10

这章主要探索了R语言中变量、向量、矩阵、数组、数据框、因子、列表创建。在下一章中,我们将着眼于R如何从文本文件、其他程序和数据库关系系统中导入数据。感谢阅读,谢谢支持!