在群里看到了一個(gè)問(wèn)題,他用R語(yǔ)言的轉(zhuǎn)置函數(shù)t()對(duì)下面形式的數(shù)據(jù)進(jìn)行了轉(zhuǎn)置

轉(zhuǎn)置之后的數(shù)據(jù)結(jié)構(gòu)如下

他發(fā)現(xiàn)轉(zhuǎn)置之后多了一行,也就是有了geneid這一行,和他預(yù)期的不符合。按照預(yù)期,geneid這一行應(yīng)該是成為列名,而不是作為輸出的第一行。那么,為什么會(huì)出現(xiàn)這個(gè)情況呢?這就需要從t()這個(gè)函數(shù)說(shuō)起。
使用?t,你會(huì)得到關(guān)于這個(gè)函數(shù)的函數(shù)說(shuō)明。在函數(shù)的Detials部分中,有這樣一段
A data frame is first coerced to a matrix: see as.matrix. When x is a vector, it is treated as a column, i.e., the result is a 1-row matrix.
即,數(shù)據(jù)框會(huì)先用as.matrix()轉(zhuǎn)成矩陣格式,然后再引用t(),最終你對(duì)一個(gè)數(shù)據(jù)框使用t()函數(shù)時(shí),你會(huì)得到一個(gè)矩陣,而非原先的data.frame.
舉個(gè)例子:
L3 <- LETTERS[1:3]
fac <- sample(L3, 10, replace = TRUE)
d <- data.frame(x = 1, y = 1:10, fac = fac)
t(d)


因?yàn)榫仃囈蟠娣诺膬?nèi)容是同一種數(shù)據(jù)類型,對(duì)于輸入的數(shù)據(jù)框而言,一般都會(huì)有字符串,數(shù)值這些,那么最終都會(huì)被轉(zhuǎn)成字符串。
對(duì)于最開始的問(wèn)題而言,因?yàn)樵鹊臄?shù)據(jù)框的第一列是字符串,那么自然而然會(huì)把所有的數(shù)據(jù)都變成字符串,然后把第一列變成第一行。而如果要實(shí)現(xiàn)他真正的目的,需要先將第第一行變成行名,然后刪掉第一行在轉(zhuǎn)置,也就是
row.names(df) <- df$gene_id
df <- df[,-1]
df <- t(df)
其結(jié)果就是先保證原來(lái)的數(shù)據(jù)框里面都是數(shù)值數(shù)據(jù),而不是讓第一列充當(dāng)行名。
延伸一下,對(duì)于超過(guò)2維的數(shù)組,我們要用到aperm函數(shù)才能對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)置。當(dāng)然,超過(guò)二維的轉(zhuǎn)置,你甚至都無(wú)法直觀感受到這是一個(gè)什么過(guò)程。