title: "数据框取子集、修改和连接的方法"
output: html_document
date: "2023-03-18"
先生成一个数据框df1作为示例数据框
代码语言:text复制df1 <- data.frame(gene = paste0("gene",1:4),
change = rep(c("up","down"),each = 2),
score = c(5,3,-2,-4))
df1
代码语言:txt复制## gene change score
## 1 gene1 up 5
## 2 gene2 up 3
## 3 gene3 down -2
## 4 gene4 down -4
1.数据框取子集
(1)按列取子集:用"$"符号
代码语言:text复制df1$gene #df1后加"$",再按tab键可以直接选择df1的列名
代码语言:txt复制## [1] "gene1" "gene2" "gene3" "gene4"
代码语言:text复制df1$score
代码语言:txt复制## [1] 5 3 -2 -4
代码语言:text复制mean(df1$score) #计算scroe这一列的均值
代码语言:txt复制## [1] 0.5
(2)按名字取子集:
代码语言:text复制df1[,"gene"]
代码语言:txt复制## [1] "gene1" "gene2" "gene3" "gene4"
代码语言:text复制df1[,c('gene','change')]
代码语言:txt复制## gene change
## 1 gene1 up
## 2 gene2 up
## 3 gene3 down
## 4 gene4 down
(3)按逻辑值取(条件)子集:
代码语言:text复制df1[df1$score>0,] #取score>0的行
代码语言:txt复制## gene change score
## 1 gene1 up 5
## 2 gene2 up 3
(4)按坐标位置取子集:
代码语言:text复制df1[2,] #取第2行
代码语言:txt复制## gene change score
## 2 gene2 up 3
代码语言:text复制df1[,2] #取第2列
代码语言:txt复制## [1] "up" "up" "down" "down"
代码语言:text复制df1[2,2] #取第2行,第2列
代码语言:txt复制## [1] "up"
代码语言:text复制df1[c(1,3),1:2] #取第1和第3行,第1和第2列
代码语言:txt复制## gene change
## 1 gene1 up
## 3 gene3 down
运用代码提取数据框特殊的列
1)如何取数据框的最后一列?
代码语言:text复制df1[,ncol(df1)] #最后一列就是列数值
代码语言:txt复制## [1] 5 3 -2 -4
2)如何取数据框除了最后一列以外的其他列?
代码语言:text复制df1[,-ncol(df1)]
代码语言:txt复制## gene change
## 1 gene1 up
## 2 gene2 up
## 3 gene3 down
## 4 gene4 down
3)筛选score > 0的基因
代码语言:text复制df1[df1$score > 0,1] #方法1
代码语言:txt复制## [1] "gene1" "gene2"
代码语言:text复制df1[df1$score > 0,"gene"] #方法2
代码语言:txt复制## [1] "gene1" "gene2"
代码语言:text复制df1$gene[df1$score > 0] #方法3
代码语言:txt复制## [1] "gene1" "gene2"
方法3中gene列和score列是一一对应的,所以逻辑值通用。
对于x逻辑值向量,用于取子集的逻辑值向量与x对应即可,不必须由x生成。
2.数据框修改
(1)改一个格
代码语言:text复制df1[3,3] <- 5
df1
代码语言:txt复制## gene change score
## 1 gene1 up 5
## 2 gene2 up 3
## 3 gene3 down 5
## 4 gene4 down -4
(2)改一整列
代码语言:text复制df1$score <- c(12,23,50,2)
df1
代码语言:txt复制## gene change score
## 1 gene1 up 12
## 2 gene2 up 23
## 3 gene3 down 50
## 4 gene4 down 2
(3)新增一列
代码语言:text复制df1$p.value <- c(0.01,0.02,0.07,0.05)
df1
代码语言:txt复制## gene change score p.value
## 1 gene1 up 12 0.01
## 2 gene2 up 23 0.02
## 3 gene3 down 50 0.07
## 4 gene4 down 2 0.05
(4)改行名和列名——本质是在修改向量
代码语言:text复制rownames(df1) <- c("r1","r2","r3","r4")
df1
代码语言:txt复制## gene change score p.value
## r1 gene1 up 12 0.01
## r2 gene2 up 23 0.02
## r3 gene3 down 50 0.07
## r4 gene4 down 2 0.05
(5)只修改某一行/列的名——本质也是在修改向量
代码语言:text复制colnames(df1)[2] <- "CHANGE"
df1
代码语言:txt复制## gene CHANGE score p.value
## r1 gene1 up 12 0.01
## r2 gene2 up 23 0.02
## r3 gene3 down 50 0.07
## r4 gene4 down 2 0.05
(6)按照某一列去重复
代码语言:text复制df1[!duplicated(df1$CHANGE),]
代码语言:txt复制## gene CHANGE score p.value
## r1 gene1 up 12 0.01
## r3 gene3 down 50 0.07
3.两个数据框的连接——merge函数
先生成3个数据框:
代码语言:text复制test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'),
blood_type = c("A","B","O","AB"))
test1
代码语言:txt复制## name blood_type
## 1 jimmy A
## 2 nicker B
## 3 Damon O
## 4 Sophie AB
代码语言:text复制test2 <- data.frame(name = c('Damon','jimmy','nicker','tony'),
group = c("group1","group1","group2","group2"),
vision = c(4.2,4.3,4.9,4.5))
test2
代码语言:txt复制## name group vision
## 1 Damon group1 4.2
## 2 jimmy group1 4.3
## 3 nicker group2 4.9
## 4 tony group2 4.5
代码语言:text复制test3 <- data.frame(NAME = c('Damon','jimmy','nicker','tony'),
weight = c(140,145,110,138))
test3
代码语言:txt复制## NAME weight
## 1 Damon 140
## 2 jimmy 145
## 3 nicker 110
## 4 tony 138
(1)当两个数据框有共同的列名时,在merge函数中用by = "共同列名"将两个数据框连接
代码语言:text复制merge(test1,test2,by="name")
代码语言:txt复制## name blood_type group vision
## 1 Damon O group1 4.2
## 2 jimmy A group1 4.3
## 3 nicker B group2 4.9
(2)当两个数据框没有共同的列名,且存在有交集的共同列时,在merge函数中用by.x = 和by.y = 将两个数据框连接,注意对应关系
代码语言:text复制merge(x = test1,y = test3,by.x = "name",by.y = "NAME")
代码语言:txt复制## name blood_type weight
## 1 Damon O 140
## 2 jimmy A 145
## 3 nicker B 110
merge()函数只能用于数据框的连接!
4.两个数据框的连接——join函数
代码语言:text复制test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'),
blood_type = c("A","B","O","AB"))
test1
代码语言:txt复制## name blood_type
## 1 jimmy A
## 2 nicker B
## 3 Damon O
## 4 Sophie AB
代码语言:text复制test2 <- data.frame(name = c('Damon','jimmy','nicker','tony'),
group = c("group1","group1","group2","group2"),
vision = c(4.2,4.3,4.9,4.5))
test2
代码语言:txt复制## name group vision
## 1 Damon group1 4.2
## 2 jimmy group1 4.3
## 3 nicker group2 4.9
## 4 tony group2 4.5
代码语言:text复制library(dplyr)
inner_join(test1,test2,by="name") #取交集
代码语言:txt复制## name blood_type group vision
## 1 jimmy A group1 4.3
## 2 nicker B group2 4.9
## 3 Damon O group1 4.2
代码语言:text复制right_join(test1,test2,by="name") #右连接,保留右边表格的name列,缺失值填充NA
代码语言:txt复制## name blood_type group vision
## 1 jimmy A group1 4.3
## 2 nicker B group2 4.9
## 3 Damon O group1 4.2
## 4 tony <NA> group2 4.5
代码语言:text复制full_join(test1,test2,by="name") #全连接,两个表的name列都要,缺失值填充NA
代码语言:txt复制## name blood_type group vision
## 1 jimmy A group1 4.3
## 2 nicker B group2 4.9
## 3 Damon O group1 4.2
## 4 Sophie AB <NA> NA
## 5 tony <NA> group2 4.5
代码语言:text复制semi_join(test1,test2,by="name") #半连接,左边表格中的人名在右边表格中存在的行则保留,否则删去
代码语言:txt复制## name blood_type
## 1 jimmy A
## 2 nicker B
## 3 Damon O
代码语言:text复制anti_join(test1,test2,by="name") #反连接,左边表格中的人名在右边表格中不存在的行保留,否则删去
代码语言:txt复制## name blood_type
## 1 Sophie AB
引用自生信技能树