前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据框取子集、修改和连接的方法

数据框取子集、修改和连接的方法

原创
作者头像
小叮当aka
修改2023-03-20 16:29:22
1.6K0
修改2023-03-20 16:29:22
举报

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

引用自生信技能树

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先生成一个数据框df1作为示例数据框
  • 1.数据框取子集
    • (1)按列取子集:用"$"符号
      • (2)按名字取子集:
        • (3)按逻辑值取(条件)子集:
          • (4)按坐标位置取子集:
            • 运用代码提取数据框特殊的列
              • 1)如何取数据框的最后一列?
              • 2)如何取数据框除了最后一列以外的其他列?
              • 3)筛选score > 0的基因
          • 2.数据框修改
            • (1)改一个格
              • (2)改一整列
                • (3)新增一列
                  • (4)改行名和列名——本质是在修改向量
                    • (5)只修改某一行/列的名——本质也是在修改向量
                      • (6)按照某一列去重复
                      • 3.两个数据框的连接——merge函数
                        • 先生成3个数据框:
                          • (1)当两个数据框有共同的列名时,在merge函数中用by = "共同列名"将两个数据框连接
                            • (2)当两个数据框没有共同的列名,且存在有交集的共同列时,在merge函数中用by.x = 和by.y = 将两个数据框连接,注意对应关系
                              • merge()函数只能用于数据框的连接!
                              • 4.两个数据框的连接——join函数
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档