数据框中的数据结构
> aa
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 5 9 13 17 21
[2,] 2 6 10 14 18 22
[3,] 3 7 11 15 19 23
[4,] 4 8 12 16 20 24
> class(aa)
[1] "matrix" "array"
> bb <- as.data.frame(aa)
> bb
V1 V2 V3 V4 V5 V6
1 1 5 9 13 17 21
2 2 6 10 14 18 22
3 3 7 11 15 19 23
4 4 8 12 16 20 24
> View(bb) #现在bb这个数据框中的元素都是数值,其视图如下图一
> bb[2,3] <- "10" #把bb中的一个元素变成字符串,则此列的所有元素都会变为字符串格式
> View(bb)
此数据框中的所有元素都是数值,在表格中全部靠右排放
图一.png
此时数据框中第三列为字符串,其他列全是数值;在摆放时,字符串靠左,数值靠右
图二.png
1. 数据框列名操作
- 可以看成是一个表格,第一行为列名,称之为字段或者变量名
- 数据框也是一个列表,是一个各元素等长的列表
1.1 提取数据框列名
b <- colnames(a)
a : 数据框名称
b : 由数据框列名按顺序组成的向量
1.2 更改数据框列名
b <- c("FBgn","symbol","p_value","average","cluster")
names(a) <- b
a : 数据框名称
b : 由数据框所有新列名按顺序排列而成的向量
2. 数据框中提取某一列
2.1 提出某列为数据框格式
b <- a[,2]
a : 数据框名称
b : 新的数据框名称
这个例子是:提取数据框a中的第2列,并把这个单列的数据框赋值给变量b,b则成为一个单列数据框
2.2 提出某列为向量格式
b <- a$gene
a : 数据框名称
b : 向量名称
$ : 表示对数据框中某一列的提取或者调用,后面根列名
这个例子是:提取数据框a中的第二列为向量,并把这个向量赋值给变量b
3.向数据框中添加一个新列
3.1 将向量作为一个新列添加到数据框中
b <- c("1","2","3","4")
a <- data.frame(a,b)
a : 将被添加列的数据框
b : 要添加为列的向量
如果数据框a是有列名的,则向量b的向量名会作为
这个例子是:把b这个向量作为最后一列添加到数据框a中,并把生成的新数据框赋值给变量a(整体上是对a添加新列)
3.2 将单列数据框添加到一个数据框中
a <- mutate(a,b)
a : 数据框名称
b : 一个单列数据框
这个例子是:把单列数据框b添加到数据框a的最后,新形成的数据框赋值给变量a(整体上是对a添加新列)
1.向数据框中添加一列
数据框名[["新列名"]] <- 新列值(长度一定和数据框原有列长度一致)
2.删除数据框中的某列
name.dataframe <- subset(name.dataframe, select = -列名 ) #删除固定列名的一列
4. 生成数据框
4.1 从矩阵生成数据框
> bb <- as.data.frame(aa) #aa是一个矩阵,bb是一个数据框,矩阵中只能存在一种类型的数据,数据框中可以同时存在多种类型的数据
> is.list(bb) #查看一个数据框是否是一个列表结构
[1] TRUE #一个数据框也可以看作是一个列表,其中每列可以看作是列表中的一个元素
数据框中的变量取值
> aa <- data.frame(name=c("la","ls","ld","lf"),number=1:4,score=rnorm(4,2,1))
> aa
name number score
1 la 1 3.284
2 ls 2 1.099
3 ld 3 1.241
4 lf 4 0.672
> aa[2,3] #取一个元素
[1] 1.1
> aa[,2] #取一列
[1] 1 2 3 4
> class(aa[,2])
[1] "integer"
> is.vector(aa[,2])
[1] TRUE # 数据框中一列的值取出来,得到一个向量
> aa[2,] #取一行
name number score
2 ls 2 1.1
> class(aa[2,])
[1] "data.frame" #取出数据框的一行,得到一个数据框
> aa[c(T,F),] #用逻辑值来取值,所给出的逻辑值向量会被循环使用,直到取完最后一个值
name number score
1 la 1 3.28
3 ld 3 1.24
> aa[c(T,F,F),] #用逻辑值来取值,所给出的逻辑值向量会被循环使用,直到取完最后一个值
name number score
1 la 1 3.284
4 lf 4 0.672
> aa[,c("number","name")] #通过列名来取列,所取的列会按照取列时的列名顺序来重新排列
number name
1 1 la
2 2 ls
3 3 ld
4 4 lf
> grepl("ld",aa$name)
[1] FALSE FALSE TRUE FALSE
> aa[grepl("ld",aa$name),] #通过逻辑值来取值,配合grep函数来使用,效率会很高
name number score
3 ld 3 1.24
> grep("ld",aa$name)
[1] 3
> aa[grep("ld",aa$name),] #通过下标来取值
name number score
3 ld 3 1.24
>aa[aa$name=="la",] #根据行名直接进行取行
去除数据框中的某行或某列
> aa <- data.frame(name=c("la","ls","ld","lf"),number=1:4,score=rnorm(4,2,1))
> aa
name number score
1 la 1 1.754142
2 ls 2 3.141787
3 ld 3 3.857394
4 lf 4 2.634266
> bb <- aa[,-2] #去除第二列,原数据框结构不会改变
> bb
name score
1 la 1.754142
2 ls 3.141787
3 ld 3.857394
4 lf 2.634266
> cc <- aa[-2,] #去除第二行,原数据框结构不会改变
> cc
name number score
1 la 1 1.754142
3 ld 3 3.857394
4 lf 4 2.634266
5. 对数据框中的数值进行查找并且替换
> aa <- as.data.frame(matrix(1:20, c(4,5)))
> aa
V1 V2 V3 V4 V5
1 1 5 9 13 17
2 2 6 10 14 18
3 3 7 11 15 19
4 4 8 12 16 20
> aa[3,4] <- "."
> aa[2,5] <- "."
> aa
V1 V2 V3 V4 V5
1 1 5 9 13 17
2 2 6 10 14 .
3 3 7 11 . 19
4 4 8 12 16 20
> aa=="." #对数据框中的特定字符或者数字进行查找,查找结果是布尔值构成的数据框
V1 V2 V3 V4 V5
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE TRUE
[3,] FALSE FALSE FALSE TRUE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE
> aa[aa=="."] <- "kkkk" #对特定位点的值进行替换
> aa
V1 V2 V3 V4 V5
1 1 5 9 13 17
2 2 6 10 14 kkkk
3 3 7 11 kkkk 19
4 4 8 12 16 20
6. subset()
https://www.cnblogs.com/liujiaxin2018/p/13763799.html
来自于
base
包
根据某一列的值对数据框进行选择 :
subset(data_frame_name, subset=column_name==value)
根据列名删除某列 :subset(data_frame_name, select=-column_name)
> kk <- as.data.frame(matrix(1:30, nrow = 6))
> kk[["Type"]] <- c(rep("AA",4), rep("BB",2))
>
> subset(kk, subset=Type=="AA") '#根据某一列的值对数据框进行选择
V1 V2 V3 V4 V5 Type
1 1 7 13 19 25 AA
2 2 8 14 20 26 AA
3 3 9 15 21 27 AA
4 4 10 16 22 28 AA
>
> subset(kk, select=-Type) #根据列名删除某列
V1 V2 V3 V4 V5
1 1 7 13 19 25
2 2 8 14 20 26
3 3 9 15 21 27
4 4 10 16 22 28
5 5 11 17 23 29
6 6 12 18 24 30