说说R语言的转置

Python0248

说说R语言的转置,第1张

在群里看到了一个问题,他用R语言的转置函数 t() 对下面形式的数据进行了转置

转置之后的数据结构如下

他发现转置之后多了一行,也就是有了geneid这一行,和他预期的不符合。按照预期,geneid这一行应该是成为列名,而不是作为输出的第一行。那么,为什么会出现这个情况呢?这就需要从 t() 这个函数说起。

使用 ?t ,你会得到关于这个函数的函数说明。在函数的Detials部分中,有这样一段

即,数据框会先用 as.matrix() 转成矩阵格式,然后再引用 t() ,最终你对一个数据框使用 t() 函数时,你会得到一个矩阵,而非原先的data.frame.

举个例子:

因为矩阵要求存放的内容是同一种数据类型,对于输入的数据框而言,一般都会有字符串数值这些,那么最终都会被转成字符串。

对于最开始的问题而言,因为原先的数据框的第一列是字符串,那么自然而然会把所有的数据都变成字符串,然后把第一列变成第一行。而如果要实现他真正的目的,需要先将第第一行变成行名,然后删掉第一行在转置,也就是

其结果就是先保证原来的数据框里面都是数值数据,而不是让第一列充当行名。

延伸一下,对于超过2维的数组,我们要用到 aperm 函数才能对数据进行转置。当然,超过二维的转置,你甚至都无法直观感受到这是一个什么过程。

#读取wet.txt需要转换的目标矩阵,显示原行列。本例中行为sample,列为otu

otu<-read.delim('E:\\R语言网络分析\\wet.txt',sep='\t',row.names=1)

otu1<-t(otu)

write.table(otu1,file='otu9.txt',sep='\t',row.names=T)

#读取wet.xlsx需要转换的目标矩阵,显示原行列。本例中行为sample,列为otu

library(openxlsx)

otu<-read_excel("E:\\R语言网络分析\\wet.xlsx")

otu1=t(otu)

##导出已转置文件到本地储存,此处导出的文件为Excel格式文件

write.xlsx(otu1,file="otu11.xlsx",sep='\t',row.names=T)

# 将otu1保存为csv文件

write.csv(otu1,file="otu11.csv")

library(openxlsx)

otu<-read_excel("E:\\R语言网络分析\\wet.xlsx")

head(otu)

class(otu)

otu1=t(otu)

write.xlsx(otu1,file="otu2.xlsx") ##导出已转置文件到本地储存,此处导出的文件为Excel格式文件

# 将otu1保存为csv文件

write.csv(otu1,file="otu5.csv")

t()

给定矩阵或数据框x,t函数返回x的转置。

矩阵里面所有内容都是相同类型数据,使用t()不会有问题。

转置后

可以看出来就是行变列,列变行了。数值型还是数值型。

再看看字符串类型的转置

转置后

可以看出来就是行变列,列变行了。字符串还是字符串。

数值型数据框和矩阵差不多,转置不会有太大问题。

转置后

但是转置前是data.frame,转置后的结果是matrix

如果data.frame里面既有数值型,又有字符串,t()转置后得到的matrix里面全部都会变成字符串。

可以看到Name是chr类型,Score是num类型 。再来t()转置后看看

可以看到原来的Score的数值型被转换成chr字符串类型了,不能再进行针对数值型的操作了。

这个时候如果还希望保持原来的数据类型,则需要用到as.data.frame函数

这时候转化后的Score行里面的数字都是数值型了。

因此,在对保护复杂数据类型的data.frame进行转置时,最好使用as.data.frame(t(x))来操作。