转置之后的数据结构如下
他发现转置之后多了一行,也就是有了geneid这一行,和他预期的不符合。按照预期,geneid这一行应该是成为列名,而不是作为输出的第一行。那么,为什么会出现这个情况呢?这就需要从 t() 这个函数说起。
使用 ?t ,你会得到关于这个函数的函数说明。在函数的Detials部分中,有这样一段
即,数据框会先用 as.matrix() 转成矩阵格式,然后再引用 t() ,最终你对一个数据框使用 t() 函数时,你会得到一个矩阵,而非原先的data.frame.
举个例子:
因为矩阵要求存放的内容是同一种数据类型,对于输入的数据框而言,一般都会有字符串,数值这些,那么最终都会被转成字符串。
对于最开始的问题而言,因为原先的数据框的第一列是字符串,那么自然而然会把所有的数据都变成字符串,然后把第一列变成第一行。而如果要实现他真正的目的,需要先将第第一行变成行名,然后删掉第一行在转置,也就是
其结果就是先保证原来的数据框里面都是数值数据,而不是让第一列充当行名。
延伸一下,对于超过2维的数组,我们要用到 aperm 函数才能对数据进行转置。当然,超过二维的转置,你甚至都无法直观感受到这是一个什么过程。
别的不清楚,R有两种做法。
一种用matrix()把1:10扩展成相应的矩阵,然后相加
x <- 1:10v <- rep(x, 10) # 把x重复个10次,v是100维向量,10个1到10的循环
m1 <- matrix(v, 10, 10) # 把v铺在一个10*10的矩阵里,按列铺
m2 <- matrix(v, 10, 10, byrow = T) # 把v铺在一个10*10的矩阵里,按行铺
m1 + m2
第二种就是用一个1向量和1:10左右矩阵相乘达到和上面m1,m2相同的效果
x <- 1:10one <- rep(1,10)
m1 <- one %*% t(1:10) # t是把列向量转置成行向量
m2 <- 1:10 %*% t(one)
m1 + m2
如果两向量为a,ba <- c(1:5) #长度5
b <- c(1:7) #长度7
# 写入到文本text.txt
write.table(t(a), file = "test.txt", append = T, col.names = F, row.names = F)
write.table(t(b), file = "test.txt", append = T, col.names = F, row.names = F)
# t() 函数将向量转置 以便以行的形式写入
# append 是继续在文件末尾写入而非擦写
# col.names 和row.names 设定为行和列的标签为空。