R基本数据结构

R基本数据结构

零、各种基本数据结构通行规则

(一)创建 : 向量,数据框和列表

涉及函数: c() data.frame() list()

1. 直接创建

a <- c(name1 = 1, name2 = 2)

mydata <- data.frame(name = c("Mike", "Tom", "Tony"), height = c(160, 180, 170), stringsAsFactors = F )

mylist <- list(vector1 = c( , , ,...), strvector2 = c("","","",...), matrix3 = matrix(), ...)

2. 先创建基本元素,再组合

name1 <- 1
name2 <- 2
a <- c(name1, name2)

name <- c("Mike", "Tom", "Tony")
height <- c(160, 180, 170)
mydata <- data.frame(name, height)

mylist <- list(namevec1, namestr2, namematrix3)

(二)命名

1. 向量和列表创建后的命名names(x)

names(x) <- c("a", "学校", "TT", "#", "5")

注 : 必须在向量和列表创建后,再使用names对其元素命名.
如果把names= 看作一个参数加入c()和list()函数,list会多了一个名称为"names"的元素

2. 矩阵和数据框行列的命名

创建时命名

1)矩阵 : 在matrix()中加入参数dimnames = list()
2)数据框 : 在data.frame()中参加参数row.names=
注 : 数据框创建时只能添加行名参数

创建后命名

矩阵和数据框的所用函数和用法是相同的 : colnames(x)<- rownames(x)<-

(三)元素的访问

数据访问使用[ ],函数使用( )

1. 通用访问方法:indice

访问向量x的第二个和第七个元素 x[c(2,7)]
访问矩阵x的第三个到第五个元素 x[3:9, 5]
注: 列表稍有不同
访问列表x的第二个元素x[[2]]
访问列表x的子列:第二个元素x[2] 访问列表x的子列:第三个元素和第八个元素x[c(3,8)]

2. 命名后,可以用名称为索引访问 :

用于向量,数据框和列表
x["name"]
x[["name"]]
注 : 矩阵不能这样访问

3.命名后也可以用$索引:数据框,列表

x$name

(四)元素的增减

1. 元素的增加

1) 直接赋值型 : 向量,数据框,列表,矩阵

  • 通过下标索引添加元素

z[3:4] <- c(T,F)

  • 通过给定名称添加元素

z["c"] <- "sailing"

  • 通过$添加元素

mydata$Nat<-c("EU","JA","EU")

注 : 直接赋值也可以用于元素的更改

y[,c(1,3)] <- matrix(c(1,1,8,12),nrow=2)

2)使用函数型 : 矩阵,数据框 rbind()cbind()

2. 元素的删除

1) 索引访问+负号"-"

删除向量x的最后一个元素 x[-length(x)]
删除矩阵x的第四列 x[,-4]

2) 任何访问+NULL

x["name"] <- NULL
x$name <- NULL

3) 附 : 缺失值的删除na.omit(x)

na.omit(x)只能对向量,矩阵和数据框使用,在对矩阵和数据框使用时,会删去NA所在的一行

(五) 向量,矩阵和数据框的筛选

注 : 列表和因子不需要筛选

1. 普通筛选 : 向量化运算 + 下标索引

z <- c(1, 2, 3, 4, 21, 4, 2, 3)
z[z*z >= 10]
[1] 4 21 4

a<-matrix(3:32, 5, 6)
a[, 1] ,> 6
[1] FALSE FALSE FALSE FALSE TRUE

mydata[mydata$speed>10,]
name tall answer speed
laa tom 175 FALSE 20
laaa jack 170 TRUE 15

2. which()函数

1). Description
Give the TRUE indices of a logical object, allowing for array indices
2). Usage
which(x, arr.ind = FALSE)
3). Examples

a<-matrix(c(1, 2, 1, 1, 1, 2, 3, 1, 2, 3), 5, 2)
which(a>2)
[1] 7 10

which(a>2, arr.ind = TRUE)
row col
[1,] 2 2
[2,] 5 2

which(mydata$age == 20)
[1] 1 5

3. subset() 函数

1) subset函数和which函数在NA的处理上与普通筛选具有不同

x <- c(1, 2, 3, rep(8, 2), NA, rnorm(2, 1))
x[x > 3]
[1] 8 8 NA

which(x > 3)
[1] 4 5

subset(x, x > 3)
[1] 8 8

2)usage : subset(x, test, select = )

subset(a, a[, 1]>6)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 7 12 17 22 27 32

subset(airquality, Temp > 95, select = c(Ozone, Temp))
Ozone Temp
120 76 97

(六)数据框和向量的排序

1. sort(x, decreasing = )

sort(c(10 : 3, 2 : 12), method = "shell", index.return = TRUE)
$x
[1] 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 12
$ix
[1] 9 8 10 7 11 6 12 5 13 4 14 3 15 2 16 1 17 18 19

is.unsorted(sort(mydata$age))
[1] FALSE
> is.unsorted(sort(mydata$age), strictly = TRUE)
[1] TRU:25])
[1] 1 2 3 5 5 6 6 7 7 7 7 7 8 8 9 9 10 12 12 12 12 13 15 20 28

2. rank()

我觉得rank不适合用于数据框,就别用了,只用于向量吧

rank(x1 <- c(3, 1, 4, 15, 92))
[1] 2 1 3 4 5

x2 <- c(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)
> rank(x2, ties.method= "first")
[1] 4 1 6 2 7 11 3 10 8 5 9

rank(x2, ties.method= "random")
[1] 4 2 6 1 8 11 3 10 7 5 9

3. order()

x<-c(1,3,4,6,3,2,5,1) > order(x) [1] 1 8 6 2 5 3 7 4
> c(1,2,5)+c(3,2)
[1] 4 4 8
注:order(x)[1] = which.min(x)

order(mydata$sex, mydata$height)

(七)隐性循环函数

1. 矩阵 : apply() 和 sweep()

1) apply(x, MARGIN, FUN)

  • x为矩阵
  • MARGIN=1对行运算,MARGIN=2对列运算
  • FUN用来指定运算函数

2)sweep(x, MARGIN, STATS, FUN = “-”)

  • example sweep(A, 1, A.min)

2. 数据框和列表 : lapply() 和 sapply()

区别:输出格式不同

lapply(list(1:3,25:29),median)
[[1]]
[1] 2
[[2]]
[1] 27

sapply(list(1:3,25:29),median)
[1] 2 27

3. 因子 : tapply()

  • tapply(x, f, g): 将一个向量x分成组, 然后对每组应用指定的函数。
  • x是一个向量,f是x对应的水平,g是一个函数

ages <- c(25,26,55,37,21,42)
affils <- c("R","D","D","R","U","D")
tapply(ages,affils,mean)
D R U 41 31 21

(八)类型转换

  1. 判断函数 is.datatype
  2. 转换函数 as.datatype

(九)其他

  1. dim()函数通用于求维度
  2. mode和class的区别
  3. R语言没有标量,标量以单向量的形式出现

一、向量

(一)向量的创建

1. 生成固定间隔的向量 seq(from, to, by, length.out, along.with)

  • 生成间隔为5的递减向量 seq(from = 100, to = 1, by = -5)
  • 生成从100到1的20个间隔相等的序列 seq(from = 100, to = 1, length.out = 20)
  • seq的第一个参数是序列长度

    x <- c(4, 5, 7)
    seq(x) [1] 1 2 3

  • seq的两个子函数

    seqalong(along.with)
    seq
    len(length.out)

2. 重复向量常数rep(x, times, length.out, each)

  • times

    rep(c(1, 3, 5), 3)
    [1] 1 3 5 1 3 5 1 3 5

  • each

    rep(c(1, 3, 5), each = 3)
    [1] 1 1 1 3 3 3 5 5 5

    rep(c(1, 3, 5), c(1, 2, 3))
    [1] 1 3 3 5 5 5

    rep(1:4, each = 2, times = 3)
    [1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4

  • rep的对象可以为其他数据结构,如因子、列表、时间......
  • rep的两个子函数

    rep.int(x, times)
    rep_len(x, length.out)

(二)向量的判断

  1. all()
  2. any()
  3. 判断向量是否相等(后两个函数作用相同)

    x <- c(1, 2)
    y <- c(3, 2)
    x == y
    [1] FALSE TRUE

    all(x == y)
    [1] FALSE

    identical(x, y)
    [1] FALSE

(三)向量化函数

  1. 向量化运算符函数:应用到向量的每一个元素,如 求平方根、对数和三角函数、取整round等。
    注意事项

    • 自动循环补齐
    • 自动扩展

      x <- c(2,1,3)
      x[7]<- 10
      x
      [1] 2 1 3 NA NA NA 10

    • NA的处理

      x<-c(1,NA,2,3)
      mean(x, na.rm=T)
      [1] 2

      mean(x)
      [1] NA

  2. 向量化的条件函数:ifelse()

    x <- c(6:-4)
    ifelse(x >= 0, sqrt(x), NA)
    [1] 2.449490 2.236068 2.000000 1.732051 1.414214 1.000000 0.000000 NA NA NA NA

(四)练习题

  1. 创建一个名为“first6”的函数, 使得它返回向量中 第一个值为6的元素的下标
  2. 回顾刚才的练习题:请使用which( )函数,创建一个名为“first6”的函数, 使得它返回向量中第 一个值为6的元素的下标。
  3. 创建向量z=(1, 3, 8, 2, 20)‘. 请把z中所有大于3 的元素替换成0。
  4. 考虑z如上题,找出z中所有大于2的元素的下标。

二、矩阵和数组

(一)矩阵和数组的创建

  1. 使用matrix()函数创建矩阵
    matrix(vector, nrow, ncol, byrow=F, dimnames=list(char_vector_rownames,char_vector_c olnames))
    注:矩阵也可以变成向量as.vector
  2. 使用array函数创建数组
    array(vector, dimensions, dimnames)
  3. 使用dim()函数创建矩阵和数组

    z <- c(5 : 34)
    dim(z) <- c(2, 5, 3)
    z
    , , 1

    [, 1] [, 2] [, 3] [, 4] [, 5]
    [1,] 5 7 9 11 13
    [2,] 6 8 10 12 14

    , , 2

    [, 1] [, 2] [, 3] [, 4] [, 5]
    [1,] 15 17 19 21 23
    [2,] 16 18 20 22 24

    , , 3

    [, 1] [, 2] [, 3] [, 4] [, 5]
    [1,] 25 27 29 31 33
    [2,] 26 28 30 32 34

(二)矩阵的部分行列函数

1. 行数与列数

1)nrow(), ncol() 和 dim()

nrow(A)
[1] 3

ncol(A)
[1] 4

dim(A)
[1] 3 4

2) row() 和 col()

row(z)
[, 1] [, 2] [, 3]
[1,] 1 1 1
[2,] 2 2 2

2. rowSums() 和 rowMeans()

(三)矩阵的运算

1. 矩阵的转置t()

2. 矩阵的乘法

AB : A%*%B
A'B: crossprod(A,B)

3. Choleskey分解:chol()

5. 提取对角线元素diag(x)

(四)练习题

生成对角线上全为一个数,非对角线上全为另一个数的方阵。

三、数据框

(一)数据框的加载和移除

attach(mtcars)
summary(mpg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.43 19.20 20.09 22.80 33.90
detach(mtcars)
summary(mpg)
Error in summary(mpg) : object 'mpg' not found

(二)生成列联表 table()

table(mydata$age, mydata$sex)
20 21 22
F 1 0 2
M 0 1 0

(三)数据框的融合 merge()

merge(a,b,by.x = “ax”,by.y = “by”)

(四)其他相关函数

  1. 查看数据框结构str()

  2. 数据框的重新编辑fix()

  3. 数据框的随机抽样

sample(1 : nrow(mydata), 3, replace = FALSE)
[1] 6 1 3

四、列表

(一)列表的创建 : vector()

因为列表也是一种向量, 所以可以用vector()创建

z <- vector(mode="list")
z[["numeric"]] <- c(1,3)
z[["logical"]] <- TRUE
z $numeric [1] 1 3
$logical [1] TRUE

(二) 其他相关函数

  1. 连接两个列表c(lst1,lst2)

五、因子

(一)因子的创建 factor()

factor(x = character(), levels, labels = levels,exclude = NA, ordered = is.ordered(x), nmax = NA)

  1. 创建无序向量

factor(LETTERS[3:1])
[1] C B A
Levels: A B C

  1. 创建有序向量
    1)默认为因子输入的序

    factor(LETTERS[3:1], ordered = TRUE)
    [1] C B A
    Levels: A < B < C

    2)人为添加因子的序

    factor(LETTERS[3:1], ordered = TRUE, levels = c("B", "A", "C"))
    [1] C B A
    Levels: B < A < C

(二)按照因子按照水平分组split()

g <- c("a","b","a","a","c","b","c","d","b")
split(1:length(g),g)
>$a
>[1] 1 3 4
$b
[1] 2 6 9
$c
[1] 5 7
$d
[1] 8

(三)by()

  • 和tapply()挺像的,我也没看懂
  • 老师给的示例

    data(mtcars)
    by(mtcars, mtcars$am, function(m)lm(m$mpg~m$hp))
    mtcars$am: 0
    Call: lm(formula = m$mpg ~ m$hp) Coefficients: (Intercept) m$hp 26.62485 -0.05914

    mtcars$am: 1
    Call: lm(formula = m$mpg ~ m$hp)
    Coefficients: (Intercept) m$hp 31.84250 -0.05873

你可能感兴趣的:(R语言编程,r语言)