技术文章:R语言的数据结构和导入数据

科研菌
关注

2.1 数据结构

数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量(但不同行业对行和列叫法不同,在R中用观测和变量代表行和列)。

R可以处理的数据类型(模式)包括数值型、字符型、逻辑型(TRUE/FALSE)、复数型(虚数)和原生型(字节)。

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

1. 标量

标量是只含一个元素的向量,用于保存常量。例如例如 f<-3 、 g<-“US” 和 h<-TRUE。

2. 向量

向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量。

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

注意,单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型)。

访问向量中的元素:在方括号中给定元素所处位置

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用以指定行和列的维数

选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充

dimnames包含了可选的、以字符型向量表示的行名和列名

创建一个5×4的矩阵:

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

创建一个按行填充的2×2矩阵:

cells <- c(1,26,24,68)rnames <- c("R1", "R2")cnames <- c("C1", "C2")mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE,                   dimnames=list(rnames, cnames))  mymatrix          C1 C2    R1  1 26   R2 24 68

创建一个按列填充的2×2矩阵:

mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=FALSE,                   dimnames=list(rnames, cnames))mymatrix   C1 C2R1  1 24R2 26 68

矩阵下标的使用:

x <- matrix(1:10, nrow=2)  #创建了一个内容为数字1到10的2×5矩阵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行的第4列的元素[1] 7x[1, c(4,5)] #选择第1行的第4和5列的元素[1] 7 94. 数组

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

myarray <- array(vector, dimensions, dimnames)

vector包含了数组中的数据

dimensions是一个数值型向量,给出各个维度下标的最大值

dimnames是可选的、各维度名称标签的列表

创建一个三维(2×3×4)数值型数组:

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 245. 数据框

数据框是包含了不同模式(数值型、字符型等)的数据的集合。可通过函数data.frame()创建:

mydata <- data.frame(col1, col2, 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

每一列数据的模式必须唯一。

选取数据框中的元素:

patientdata[1:2]  patientID age1         1  252         2  34 3         3  284         4  52patientdata[c("diabetes", "status")]  diabetes    status1    Type1      Poor    2    Type2  Improved    3    Type1 Excellent    4    Type1      Poorpatientdata$age         # $用来选取一个给定数据框中的某个特定变量[1] 25 34 28 52

可以联合使用函数attach()和detach()或单独使用函数with()来简化代码,避免每个变量名前都键入一次patientdata$。

attach()、detach()和with()

例:mtcars数据框

summary(mtcars$mpg)plot(mtcars$mpg, mtcars$disp)plot(mtcars$mpg, mtcars$wt)

以上代码可以写成:

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

detach()并不会对数据框本身做任何处理,可以省略,但其实它应当被例行地放入代码中。

当名称相同的对象不止一个时,这种方法有局限性。

mpg <- c(25, 36, 47)attach(mtcars)The following object(s) are masked _by_ '.GlobalEnv':     mpg
plot(mpg, wt)Error in xy.coords(x, y, xlabel, ylabel, log) :      'x' and 'y' lengths differ
mpg    [1] 25 36 47

在数据框mtcars被绑定(attach)之前,环境中已经有了一个名为mpg的对象,原始对象将取得优先权。函数attach()和detach()最好在分析一个单独的数据框,并且没有多个同名对象时使用。

函数with()重写上例:

with(mtcars, {  print(summary(mpg))  plot(mpg, disp)  plot(mpg, wt)})

花括号{}之间的语句都针对数据框mtcars执行,如果仅有一条语句(例如summary(mpg)),那么花括号{}可以省略。
因此,函数with()的局限性在于,赋值仅在此函数的括号内生效。

with(mtcars, {  stats <- summary(mpg)  stats})stats错误: 找不到对象'stats'

创建在with()结构以外存在的对象,使用特殊赋值符<<-替代标准赋值符(<-)即可,它可将对象保存到with()之外的全局环境中。

声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存