生信技能树学习之数据结构:数据框
数据框 data.frame 二维,
每列只允许一种数据类型。列与列之间相同或者不同没有要求。
约等于“表格”原因:数据框不是独立的文件,是二元内部的一个数据,电脑上可能并没有这样一个文件,不是在电脑上真实存在的文件;excel表格没有要求一列只有一种数据类型,而数据框要求一列只能有一种数据类型。
数据框可以导出为一个表格,但并不等于数据框就是表格。
(1)用代码新建
(2)由已有数据转换或处理得到
(3)读取表格文件
(4)R语言内置数据
### 打开R语言的那一刻,可以直接使用的数据。volcano,iris,letters(默认小写字母),LETTERS(默认大写字母)
df1 <- data.frame(gene = paste0("gene",1:4),
change = rep(c("up","down"),each = 2),
score = c(5,3,-2,-4))
df1
gene change score
1 gene1 up 5
2 gene2 up 3
3 gene3 down -2
4 gene4 down -4
df2 <- read.csv("gene.csv") ###文件读取成功的关键是gene.csv这个文件已经在工作目录中
df2
gene change score
1 gene1 up 5
2 gene2 up 3
3 gene3 down -2
4 gene4 down -4
dim(df1) [1] 4 3 #dim 维度,指数据框的行数和列数
nrow(df1) [1] 4 #行的数量
ncol(df1) [1] 3 #列的数量
#行名rownames,列名colnames
rownames(df1) [1] "1" "2" "3" "4"
colnames(df1) [1] "gene" "change" "score"
$ 数据框取列,每次只能取出一列。
df1$score [1] 5 3 -2 -4
mean(df1$score) [1] 0.5
df1[2,2] [1] "up"
df1[2,] ##取第二行全部。 生成的是数据框
gene change score
2 gene2 up 3
df1[,2] ##取第二列全部 [1] "up" "up" "down" "down"。 生成的是向量
### 用[]取行时,取出的是数据框,因为一行的数据类型不确定。
### 用[]取列时,取出的是向量。因为数据框一列只允许出现一种数据类型。
df1[c(1,3),1:2] #中括号里的逗号,表示维度的分割,前面是行,后面是列。取1,3行的第1,2列
gene change
1 gene1 up
3 gene3 down
df1[,"gene"] [1] "gene1" "gene2" "gene3" "gene4"
df1[,c('gene','change')]
$ 数据框取列,每次只能取出一列。[ , ]取列,可以取多列,只要把要取出的列写成一个向量就行。 gene change
1 gene1 up
2 gene2 up
3 gene3 down
4 gene4 down
df1[df1$score>0,]
gene change score
1 gene1 up 5
2 gene2 up 3
df1[df1$score > 0,1] ###按数据库取子集的方式, [ , ]
df1[df1$score > 0,"gene"]
df1$gene[df1$score > 0] ##先把gene这一列提取出来,然后再根据逻辑值筛选
用于取子集的逻辑值向量,与x对应就行,不必由x生成。
df1[df1$change=="up" ,]
gene change score
1 gene1 up 5
2 gene2 up 3
## 代码思维
### 如何取数据框的最后一列?
df1[,3] ## [1] 5 3 -2 -4
df1[,ncol(df1)] ## [1] 5 3 -2 -4
#如何取数据框除了最后一列以外的其他列?
df1[,-ncol(df1)] ### -可以给数字用, !可以给逻辑值用。
gene change
1 gene1 up
2 gene2 up
3 gene3 down
4 gene4 down
df1[3,3] <- 5
df1
df1$score <- c(12,23,50,2) #存在原数据框中,表示修改
df1
df1$p.value <- c(0.01,0.02,0.07,0.05) ##不存在原数据框,表示新增 ,新增一列叫p.value的列
df1
rownames(df1) <- c("r1","r2","r3","r4") ### 改全部行名
colnames(df1)[2] <- "CHANGE" ##改一个列名
修改第二列的列名,就是修改【列名这个向量】第二个元素。 #练习题 #3-1.读取exercise. csv这个文件,赋值给test
test <- read.csv("exercise.csv")
test
#3-2.求test第一列数值的中位数
median(test$Petal.Length) #[1] 4.6
median(test[,1])
#3-3.筛选test中,Species列的值为a或c的行
test[test$Species!="b",]
test[test$Species=="a"|test$Species=="c",]
test[test$Species %in% c("a","c"),]
#竖线两边连接的必须是逻辑值,后边如果直接写“c”,就相当于后面连接的是字符。
##### 错误代码。 test[test$Species == c("a","c"),]
不能写==,是因为在循环补齐的过程中==会把a,c看成一个整体
merge(test1,test2,by="name") ###共同列的列名
merge(test1,test3,by.x = "name",by.y = "NAME") ###列名不同时连接 #默认x=test1 , y=test3
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。