仅用于记录R语言学习过程:

内容提要:

列表:list()函数;元素的提取

矩阵:matrix()函数及其中的参数设置;矩阵转置

数组:array()函数;dim()函数

数据框:data.frame()函数;str()函数 ;$ :增删列;修改数据框数据函数:edit()和fix();查看数据结构的函数:head()和tail();数据框的基本操作:行合并(rbind()函数)、列合并(cbind()函数)、merge()函数;数据框的切分:sample()函数、split()函数、subset()函数和[ ](方括号)。

正文:

注:内容中行首看不懂的字符如n,是由于写笔记时在word中选用不同级别的项目符号造成的,可忽略。

第四节 列表与矩阵

  list()函数:用于生成列表和清单的函数,囊括了数字,字符串,逻辑型变量

> my_list<- list(1,2,3,"R","nihao",TRUE,FALSE)
> my_list
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] "R"
[[5]]
[1] "nihao"
[[6]]
[1] TRUE
[[7]]
[1] FALSE
[] 提取元素
list中提取元素
> my_list2 <- list(1:10,letters[1:5])
> my_list2
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10
[[2]]
[1] "a" "b" "c" "d" "e"
> my_list2[1]
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10
> class(my_list2 [1])
[1] "list"
> my_list2 [[1]]
 [1]  1  2  3  4  5  6  7  8  9 10
> class (my_list2[[1]])
[1] "integer"
> my_list2[[2]]
[1] "a" "b" "c" "d" "e"
> my_list2[[2]][1]
[1] "a"  找到小写字母a

list中可以包含一个list

> my_list3 <- list(1:10,letters[1:5],list(11:14,LETTERS[1:5]))
> my_list3 [[3]][2][1]
[[1]]
[1] "A" "B" "C" "D" "E"
> my_list3 [[3]][[2]][1]
[1] "A"

  矩阵(matrix) :由M行和N列构成的数表

用matrix() 函数:参数设置:data为拟传入的数值;nrow定义矩阵的行数;byrow按行排列,默认为FALSE;ncol代表定义矩阵的列数;对行和列进行命名:dimnames接受一个列表list,把行名写在前面,列名写在后面,用c()生成函数

> my_matrix <- matrix(data=1:6, nrow = 2,byrow = TRUE)
> my_matrix
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
> my_matrix2 <- matrix(data = 1 :10, nrow = 5)
> my_matrix2
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10
 
> my_matrix3 <- matrix(data = 2,nrow = 3,ncol = 4)
> my_matrix3
     [,1] [,2] [,3] [,4]
[1,]    2    2    2    2
[2,]    2    2    2    2
[3,]    2    2    2    2
 
> my_matrix4 <- matrix(data = letters[1:3],nrow = 2,ncol = 4)
Warning message:
In matrix(data = letters[1:3], nrow = 2, ncol = 4) :
  data length [3] is not a sub-multiple or multiple of the number of rows [2]
> my_matrix4
     [,1] [,2] [,3] [,4]
[1,] "a"  "c"  "b"  "a"
[2,] "b"  "a"  "c"  "b"
 
 
> my_matrix4 <- matrix(data = letters[1:3],nrow = 2,ncol = 4,byrow = TRUE)
Warning message:
In matrix(data = letters[1:3], nrow = 2, ncol = 4, byrow = TRUE) :
  data length [3] is not a sub-multiple or multiple of the number of rows [2]
> my_matrix4
     [,1] [,2] [,3] [,4]
[1,] "a"  "b"  "c"  "a"
[2,] "b"  "c"  "a"  "b"

对矩阵的行和列进行命名:dimnames接受一个列表,把行名写在前面,列名写在后面,用c()生成函数

> my_matrix5 <- matrix(data = 1:12,nrow = 3,ncol = 4,dimnames = list(c("A","B","C"),c("V1","V2","V3","V4")))
> my_matrix5
  V1 V2 V3 V4
A  1  4  7 10
B  2  5  8 11
C  3  6  9 12


转置函数t()     作用:对调行与列


> t(my_matrix5)
    A  B  C
V1  1  2  3
V2  4  5  6
V3  7  8  9
V4 10 11 12

n  包含字符串的矩阵
> my_matrix6 <- matrix(c(1:5,letters [1:5]), nrow =2)
> my_matrix6
     [,1] [,2] [,3] [,4] [,5]
[1,] "1"  "3"  "5"  "b"  "d"
[2,] "2"  "4"  "a"  "c"  "e"
 
> t(my_matrix6)
     [,1] [,2]
[1,] "1"  "2"
[2,] "3"  "4"
[3,] "5"  "a"
[4,] "b"  "c"
[5,] "d"  "e"

第五节:数组与初识数据框


  数组:用array()函数:参数设置:data;dim表示维度,用c()生成,如c(2,4,3) 代表2行,4列,3层;给数组命名:dimnames 同矩阵,接受一个list,c()生成,行名、列名、层名

数组与矩阵的关系:矩阵为一个二维的数组,数组是多维的矩阵,因为包含层的概念


> my_array <- array(data = 1:16,dim = c(2,4,2))
> my_array
, , 1(第一层)
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
 
, , 2(第二层)
     [,1] [,2] [,3] [,4]
[1,]    9   11   13   15
[2,]   10   12   14   16
 
> dim(my_array)
[1] 2 4 2
n  dim()函数可用于改变数组的行、列、层
> dim(my_array) <- c(4,2,2)
> my_array
 
, , 1
     [,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8
, , 2
     [,1] [,2]
[1,]    9   13
[2,]   10   14
[3,]   11   15
[4,]   12   16
 
> my_array2 <- array(1:16,dim= c(4,2,2),dimnames = list(c(LETTERS[1:4]),c("col1","col2"),c("first","second")))
> my_array2
, , first
 
  col1 col2
A    1    5
B    2    6
C    3    7
D    4    8
 
, , second
 
  col1 col2
A    9   13
B   10   14
C   11   15
D   12   16
n  提取数组中的元素:提取更高维度数据结构的元素 [],逗号前为行的下标,逗号后为列的下标。
> my_matrix <- matrix(1:8,nrow = 4)
> my_matrix
     [,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8
> my_matrix[4,2]
[1] 8
> my_matrix[3]
[1] 3
> my_matrix[3,]
[1] 3 7
> my_matrix[,1]
[1] 1 2 3 4

> my_array2[2,2,1]

[1] 6

> my_array2[,1,1]

A B C D (行名)

1 2 3 4

> my_array[,1,1]

[1] 1 2 3 4

                     注:如果超出边界会报错。


  数据框

data.frame()用于生成数据框,参数设置:传入的是每一列的列名,每一列的内容通过c()函数生成,可以包含字符串、数字和逻辑判断,如:

> my_df <- data.frame(names=c("TOM","ANDY","MARRY"),age = c(24,25,26),height =c(178,176,T))

> my_df

  names age height

1   TOM  24    178

2  ANDY  25    176

3 MARRY  26    T


列名不合法的:如,1age, 11,my +-\* 等运算符

合法的列名:df_1  df_a 

数字不出现在第一位,

查询数据框的行列情况,用dim()函数; 还可以使用View()函数,V是大写的,用来显示数据框的内容(会在代码框中弹出表格),View(iris)也会弹出一个数据集; 可以使用nrow()函数和ncol()函数显示有几行几列。

> dim(my_df)
[1] 3 3

> View(my_df)
> nrow(my_df)
[1] 3
> ncol(my_df)
[1] 3

数据框的生成:列名下的数据个数需一致,否则会报错

> my_df <- data.frame(one = c(1.2,2.3,3.4,4.5,5.6),two = LETTERS[1:5],three = c(T,F,T,F,T))
> my_df
one two three
1 1.2   A  TRUE
2 2.3   B FALSE
3 3.4   C  TRUE
4 4.5   D FALSE
5 5.6   E  TRUE

 

> my_df <- data.frame(one = c(1.2,2.3,3.4,4.5,5.6),two = LETTERS[1:4],three = c(T,F,T,F,T))
Error in data.frame(one = c(1.2, 2.3, 3.4, 4.5, 5.6), two = LETTERS[1:4],  :
参数值意味着不同的行数: 5, 4


str() 函数,用于查看数据框的结构,返回值见下,obs指的是观测值,varialbes指的是变量,具体内容中返回每一列,数据类型属于哪种,具体的数据有哪些;不把字符串变成因子:在data.frame生成过程中设置参数stringsAsFactors = FALSE

> str(my_df)
'data.frame':          5 obs. of  3 variables:
 $ one  : num  1.2 2.3 3.4 4.5 5.6
 $ two  : Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5 (拟传入的是字符串)
 $ three: logi  TRUE FALSE TRUE FALSE TRUE
> my_df <- data.frame(one = c(1.2,2.3,3.4,4.5,5.6),two = c("Tom","andy","mary","bob","leo"),three = c(T,F,T,F,T))
> str(my_df)
'data.frame':  5 obs. of  3 variables:
$ one  : num  1.2 2.3 3.4 4.5 5.6
$ two  : Factor w/ 5 levels "andy","bob","leo",..: 5 1 4 2 3
$ three: logi  TRUE FALSE TRUE FALSE TRUE

 

> my_df <- data.frame(one = c(1.2,2.3,3.4,4.5,5.6),two = c("Tom","andy","mary","bob","leo"),three = c(T,F,T,F,T),stringsAsFactors = FALSE)  不把字符串变成因子
> str(my_df)
'data.frame':  5 obs. of  3 variables:
$ one  : num  1.2 2.3 3.4 4.5 5.6
$ two  : chr  "Tom" "andy" "mary" "bob" ... (character)
$ three: logi  TRUE FALSE TRUE FALSE TRUE


去除不想要的列  两种方法:

方法一:用[ ] ,括号用减号-,写明需要去掉的列,如第二列

> my_df [,-2]
one three
1 1.2  TRUE
2 2.3 FALSE
3 3.4  TRUE
4 4.5 FALSE
5 5.6  TRUE

方法二:my_df $,后面会自动弹出需要去除的列。$通常用于提取子集,很常用。

> my_df$two <- NULL(表示为空,不占据位置,与NA不同,NA是缺失值,但是也要占据一个位置)
> my_df
one three
1 1.2  TRUE
2 2.3 FALSE
3 3.4  TRUE
4 4.5 FALSE
5 5.6  TRUE


数据框新增列,同样用$

> my_df$four <- LETTERS[1:5]
> my_df
one three four
1 1.2  TRUE    A
2 2.3 FALSE    B
3 3.4  TRUE    C
4 4.5 FALSE    D
5 5.6  TRUE    E


修改数据框中生成的数据: edit()函数和fix()函数

edit(my_df) 会生成一个表,(mac系统可能需要安装XQuartz插件)但是是一次性操作,只改一次,原始数据不会改,此时需要把改完后的对话框赋予一个新的数据框my_df2

> edit(my_df)
one three four
1 1.2  TRUE    A
2 2.3 FALSE    B
3 3.4  TRUE    C
4 4.5 FALSE    D
5 5.6  TRUE    F
> my_df
one three four
1 1.2  TRUE    A
2 2.3 FALSE    B
3 3.4  TRUE    C
4 4.5 FALSE    D
5 5.6  TRUE    E

 

 

> my_df2 <- edit(my_df)
> my_df2
one three four
1 1.2  TRUE    A
2 2.3 FALSE    B
3 3.4  TRUE    C
4 4.5 FALSE    D
5 5.6  TRUE    F


fix()函数(永久性更改数据,即更改了原数据)

> fix(my_df)
> my_df
one three four
1 1.2  TRUE    A
2 2.3 FALSE    B
3 3.4  TRUE    C
4 4.5 FALSE    D
5 5.6  TRUE    F


快速查看数据结构:head()函数:参数设置:文件名,n可以设置拟看的行数

默认查看前六行,n值可以更改


快速查看数据结构:tail()函数:参数设置:文件名,n可以设置拟看的行数


默认查看后六行,n值可以更改


> head(iris,n=5)

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1          5.1         3.5          1.4         0.2  setosa

2          4.9         3.0          1.4         0.2  setosa

3          4.7         3.2          1.3         0.2  setosa

4          4.6         3.1          1.5         0.2  setosa

5          5.0         3.6          1.4         0.2  setosa

> tail(iris)

    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species

145          6.7         3.3          5.7         2.5 virginica

146          6.7         3.0          5.2         2.3 virginica

147          6.3         2.5          5.0         1.9 virginica

148          6.5         3.0          5.2         2.0 virginica

149          6.2         3.4          5.4         2.3 virginica

150          5.9         3.0          5.1         1.8 virginica

 

 


> library(psych)  #加载psych包  里面有一个describe()函数
> describe(iris)   #描述iris,查看数据框中更多的内容 mad众数;skew 偏度 kurtosis 丰度
vars   n mean   sd median trimmed  mad min max
Sepal.Length    1 150 5.84 0.83   5.80    5.81 1.04 4.3 7.9
Sepal.Width     2 150 3.06 0.44   3.00    3.04 0.44 2.0 4.4
Petal.Length    3 150 3.76 1.77   4.35    3.76 1.85 1.0 6.9
Petal.Width     4 150 1.20 0.76   1.30    1.18 1.04 0.1 2.5
Species*        5 150 2.00 0.82   2.00    2.00 1.48 1.0 3.0
range  skew kurtosis   se
Sepal.Length   3.6  0.31    -0.61 0.07
Sepal.Width    2.4  0.31     0.14 0.04
Petal.Length   5.9 -0.27    -1.42 0.14
Petal.Width    2.4 -0.10    -1.36 0.06
Species*       2.0  0.00    -1.52 0.07

 

> names(iris)   #查看变量名
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"
[5] "Species"
> names(iris) <- c("V1","V2","V3","V4","V5")  #修改变量名,不支持汉字,需要UTF-8,且运行一个函数“Sys.setlocale(category = “LC_CTYPE”,locale= “zh_CN.UTF-8”) “   现在已支持   Windows 系统的代码是 Sys.setlocale(locale =”chinese”)
> names(iris)
[1] "V1" "V2" "V3" "V4" "V5"
> head(iris)
V1  V2  V3  V4     V5
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa



  数据框的基本操作 

列合并:cbind :c 是指column ,列绑定,直接键入两个需要合并的数据框即可,但是注意两个数据框的行数需一致,否则会报错。如下:

> my_df <- data.frame(one=c("张三","ANDY","MARRY"),two = c(24,25,26),three =c(178,176,'T'))
> my_df2 <-data.frame(four=c("张三","ANDY","MARRY"),five = c(24,25,26),six =c(178,176,'T'))
> my_df3 <- cbind(my_df,my_df2)
> my_df3
    one two three  four five six
1  张三  24   178  张三   24 178
2  ANDY  25   176  ANDY   25 176
3 MARRY  26     T MARRY   26   T
n  行合并:rbind: r是指row,bind绑定。需注意的是要合并的数据框必须具有相同的变量名,不考虑变量的行数(观测量)是否一致。
> my_df4 <- data.frame(one=c("张三","ANDY","amy"),two = c(24,25,26),three =c(178,176,'T'))
> my_df5 <- rbind(my_df,my_df4)
> my_df5

    one two three

1  张三  24   178
2  ANDY  25   176
3 MARRY  26     T
4  张三  24   178
5  ANDY  25   176
6   amy  26     T

merge()函数,可以用来合并两个数据框,根据至少一个相同的变量。参数设置:x:其中一个数据框;y:另一个数据框,by:指根据什么来合并,如‘one’,不写by也行;all的默认参数是FALSE

> my_df6 <- data.frame(one=c("张三","ANDY","MARRY"),seven = c(24,25,26),eight =c(178,176,'T'))
> my_df7 <- merge(my_df,my_df6)
> my_df7
    one two three seven eight
1  ANDY  25   176    25   176
2 MARRY  26     T    26     T
3  张三  24   178    24   178

数据框的切分

sample()函数:随机抽样。参数设置:x:抽样的范围,如1:nrow(iris)(即返回行的数量);size 大小,表示要抽取的个数,replace:代替。如果size大于x,就需要用replace;prob是用于设置概率的

View(iris)

sample(1:nrow(iris),30)

iris_sub <- iris[sample(1:nrow(iris),30),]  #用了提取的[],同时在30括号外加了逗号,表示是对于行取的随机

iris_sub

设置种子,即两次随机生成的变量产生的变量相同。用set.seed()函数,为了方便后续可重复性操作,先运行种子,然后运行产生随机数,后面再次运行产生随机数前,再次先运行一遍种子。如set.seed(20)

split()函数:切分;参数设置,x是指需切分的数据框,f是指factor的缩写,根据因子进行切分,格式为f = 数据框名$列名,drop默认值为FALSE,设置为TRUE的话会把原始数据框中的因子水平去掉,保留现在的因子水平

split(iris,f = iris$e)

iris_sub2  <-split(iris,f = iris$e)
setosa <- as.data.frame(iris_sub2[1])    #转换成数据框
head(setosa)

用[] 提取,最常用  比较精细  如:

iris_sub3 <- iris[iris$e =='setosa',]
head(iris_sub3)

同样,也可以在方括号里添加逻辑表达式:

iris_sub3 <- iris[iris$e =='setosa'& iris$a > 4.5,1:2]  #1:2,代表显示前两列
head(iris_sub3)
range(iris_sub3$a)   #显示范围

subset()函数:子集  x:数据框,subset= 需传入待筛选的条件,select = 指对列进行选择    很常用的函数

iris_sub4 <- subset(iris,iris$e =='setosa'& iris$a > 4.5,select=1:2)
iris_sub4
identical(iris_sub3,iris_sub4)   #返回为TRUE,说明iris_sub3和iris_sub4是一样的