【R对数据框/矩阵的一些操作】

本文详细介绍了如何通过R语言进行矩阵操作,包括数据读入、合并、列名修改、数据筛选、求和、相对值计算,以及根据条件进行行列操作。重点展示了如何利用apply函数和tidyverse包进行数据处理,并以扩增子数据分析为例,展示了如何创建相对丰度表。

前言

矩阵:元素为数值
数据框:元素为数值或字符串或二者兼具

一、原始数据

otu表格:otu.txt
在这里插入图片描述
未全部展示,以制表符tab分隔。
物种注释表格:taxnomy.txt
在这里插入图片描述
未全部展示,以制表符tab分隔。

二、矩阵操作

注:除非说明,否则2至之后步骤根据1读入的数据进行修改

1.数据读入

#清除R之前的缓存
rm(list=ls())
#设置工作路径
setwd("E:/Lab/Experiment/Bioinformation/CSDN/dataframe/")
#读入otu表格,sep代表分隔符,可以根据自己文件进行改变,如sep=','
otu <- read.table('otu.txt',sep='\t',header = T,quote='',comment.char = '',stringsAsFactors = F)
#读入物种注释表格
tax <- read.table('taxnomy.txt',sep='\t',header = T,quote='',comment.char = '',stringsAsFactors = F)

读入后的otu表otu:930行,42列
在这里插入图片描述
读入后的物种注释表tax:930行,7列
在这里插入图片描述

2.数据框合并

根据ID名,ID名相同时,将两表的两行合并

otu_tax <- merge(tax,otu,by='ID')

得到的表格:按照tax表的ID去otu表内查找对应ID,再合并
在这里插入图片描述
按列组合——在otu列后面加上tax表,会有重复ID,且ID不一一对应;要求行数相同

z <- cbind(otu,tax)

按行组合——在otu行后面加上otu表,会有重复ID,且ID不一一对应;要求列数相同

z <- rbind(otu,otu)

上述rbind和cbind只是应用示例,rbind和cbind较多用于在某个表内添加特定列或行,如计算p值后添加显著性标记列等。

3.数据框行列名修改

#修改全部行名——给出的list长度最好与otu行数相同,否则会造成缺失列名或错误
#c(1:930)和1:930都是值生成1:930的数字列表
rownames(otu) <- c(1:930)
#修改指定行名——第一行
rownames(otu)[1] <- 1
#修改全部列名——给出的list长度最好与tax列数相同,否则会造成缺失列名或错误
colnames(tax)=c('ID','Domain','Phylum','Class','Order','Family','Genus')
#修改指定列——第2列列名
colnames(tax)[2]='Domain'

4.取部分数据

小知识:nrow(otu)为otu表行数;ncol(otu)为otu表列数
取部分列

#取连续列
#取otu的1至6列
z <- otu[1:6]
#或
z <- otu[c(1:6)]
z <- otu[,1:6]
z <- otu[,c(1:6)]

#取不连续列——1:6以及14行、17:19行
z <- otu[,c(1:6,14,17:19)]

取部分行

#取连续行
#取otu的1至6行
z <- otu[1:6,]
#或
z <- otu[c(1:6),]

#取不连续行——1:6以及14行、17:19行
z <- otu[c(1:6,14,17:19),]

取部分行以及列

#取某个元素——第1行第3列数据
z <- otu[1,3]
#取第2-6行,3-11列
z <- otu[c(2:6),c(3-11)]
#取第2-6、8行,3-11、15列
z <- otu[c(2:6,8),c(3-11,15)]

5.矩阵求和

#因为otu第一列不是数值,所以只能对其2至最后列otu[2:ncol(otu)]求和
#矩阵按列求和——otu的2至最后列对列求和
apply(otu[2:ncol(otu)],2,sum)
#等价于
colSums(otu[2:ncol(otu)])
#矩阵按列求和——otu的2至最后列对行求和
apply(otu[2:ncol(otu)],1,sum)
#等价于
rowSums(otu[2:ncol(otu)])

判断数据框某列值,对相同值的所有列进行求和:
如对otu_tax表按照属名Genus,Genus相同时将相同行的reads值求和
otu_tax的第7列是Genus,8:48列是个样品的reads数值

genus <- aggregate(otu_tax[,c(8:48)], by=list(Genus=otu_tax$Genus),FUN=sum)

得到的表genus如下:42列,280行(即有280个不同属)
在这里插入图片描述

6.矩阵按列求相对值0~1

对上述genus表求各个属在样品内占比——相对丰度表per:

library(tidyverse)
per <- sweep(genus[,2:42],2,colSums(genus[,2:42]),'/')
#colSums(per)可以发现各行和为1
#要百分比值,可以将per表各个值乘以100
per <- per*100
#colSums(per)可以发现各行和为100

7.查找或删除满足条件的矩阵行或列

对genus表

#删去Genus名为WPS-2和UBA2409的行
genus1 <- genus[!(genus$Genus %in% c('WPS-2','UBA2409')),]
#找出Genus为WPS-2和UBA2409的行
genus1 <- genus[(genus$Genus %in% c('WPS-2','UBA2409')),]
#列操作原理同上——删除列名为C1和C2的列
genus1 <- genus[,!(colnames(genus) %in% c('C1','C2'))]

8.apply应用

对genus表:按行对元素处理

#矩阵元素减去行均值,再除以行均值,是一种标准化方法
sub <- apply(genus[2:42], 1, function(x){
  (x-mean(x)) / mean(x)
})

9.根据矩阵某列值在新增列添加标记

对per表(百分比值0~100):

#当C1列值>5,在表尾新增的sig列相应处添加*标记
per[which(per$C1>5),'sig'] <- '*'

在这里插入图片描述

10.矩阵值判断和重赋值

对per表(百分比值0~100),未添加标记:

#将表中小于5的值重新赋值为0
per[per<5] <- 0

总结

之前在处理扩增子数据时,经常用到这些方法,以后用到新的方法再补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值