t()
給定矩陣或數(shù)據(jù)框x灵份,t函數(shù)返回x的轉(zhuǎn)置。
在對(duì)data.frame進(jìn)行t()操作時(shí)需要注意弦聂,避免數(shù)字變成字符串莺葫。
1. 矩陣轉(zhuǎn)置
矩陣?yán)锩嫠袃?nèi)容都是相同類(lèi)型數(shù)據(jù)枪眉,使用t()不會(huì)有問(wèn)題。
1.1 數(shù)值類(lèi)型矩陣轉(zhuǎn)置
x=matrix(1:9,3)
x
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
轉(zhuǎn)置后
t(x)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
可以看出來(lái)就是行變列欺冀,列變行了。數(shù)值型還是數(shù)值型饺饭。
1.2 字符串類(lèi)型矩陣轉(zhuǎn)置
再看看字符串類(lèi)型的轉(zhuǎn)置
y=matrix(LETTERS[1:9],3)
y
[,1] [,2] [,3]
[1,] "A" "D" "G"
[2,] "B" "E" "H"
[3,] "C" "F" "I"
轉(zhuǎn)置后
t(y)
[,1] [,2] [,3]
[1,] "A" "B" "C"
[2,] "D" "E" "F"
[3,] "G" "H" "I"
可以看出來(lái)就是行變列职车,列變行了。字符串還是字符串扛芽。
2. 數(shù)據(jù)框轉(zhuǎn)置
2.1 數(shù)值型數(shù)據(jù)框轉(zhuǎn)置
數(shù)值型數(shù)據(jù)框和矩陣差不多川尖,轉(zhuǎn)置不會(huì)有太大問(wèn)題茫孔。
x=data.frame(a=1:3,
b=4:6,
c=7:9)
x
a b c
1 1 4 7
2 2 5 8
3 3 6 9
轉(zhuǎn)置后
t(x)
[,1] [,2] [,3]
a 1 2 3
b 4 5 6
c 7 8 9
但是轉(zhuǎn)置前是data.frame,轉(zhuǎn)置后的結(jié)果是matrix
class(x)
[1] "data.frame"
class(t(x))
[1] "matrix" "array"
2.2 混合型數(shù)據(jù)框轉(zhuǎn)置
如果data.frame里面既有數(shù)值型馍悟,又有字符串剩晴,t()轉(zhuǎn)置后得到的matrix里面全部都會(huì)變成字符串。
x=data.frame(Name=c("A","B","C"),
Score=c(70,80,90))
x
Name Score
1 A 70
2 B 80
3 C 90
str(x)
'data.frame': 3 obs. of 2 variables:
$ Name : chr "A" "B" "C"
$ Score: num 70 80 90
可以看到Name是chr類(lèi)型毅整,Score是num類(lèi)型 嗤攻。再來(lái)t()轉(zhuǎn)置后看看
t(x)
[,1] [,2] [,3]
Name "A" "B" "C"
Score "70" "80" "90"
str(t(x))
chr [1:2, 1:3] "A" "70" "B" "80" "C" "90"
- attr(*, "dimnames")=List of 2
..$ : chr [1:2] "Name" "Score"
..$ : NULL
可以看到原來(lái)的Score的數(shù)值型被轉(zhuǎn)換成chr字符串類(lèi)型了,不能再進(jìn)行針對(duì)數(shù)值型的操作了承粤。
這個(gè)時(shí)候如果還希望保持原來(lái)的數(shù)據(jù)類(lèi)型闯团,則需要用到as.data.frame函數(shù)
as.data.frame(t(x))
V1 V2 V3
Name A B C
Score 70 80 90
str(as.data.frame(t(x)))
'data.frame': 2 obs. of 3 variables:
$ V1: chr "A" "70"
$ V2: chr "B" "80"
$ V3: chr "C" "90"
這時(shí)候轉(zhuǎn)化后的Score行里面的數(shù)字都是數(shù)值型了房交。
因此,在對(duì)保護(hù)復(fù)雜數(shù)據(jù)類(lèi)型的data.frame進(jìn)行轉(zhuǎn)置時(shí),最好使用as.data.frame(t(x))來(lái)操作隔心。