t(x)
给定矩阵或数据框x,t函数返回x的转置。
在对data.frame进行t()操作时需要注意,避免数字变成字符串。
1. 矩阵转置
矩阵里面所有内容都是相同类型数据,使用t()不会有问题。
1.1 数值类型矩阵转置
x=matrix(1:9,3)x[,1] [,2] [,3][1,] 1 4 7[2,] 2 5 8[3,] 3 6 9
转置后
t(x)[,1] [,2] [,3][1,] 1 2 3[2,] 4 5 6[3,] 7 8 9
可以看出来就是行变列,列变行了。数值型还是数值型。
1.2 字符串类型矩阵转置
再看看字符串类型的转置
y=matrix(LETTERS[1:9],3)y[,1] [,2] [,3][1,] "A" "D" "G"[2,] "B" "E" "H"[3,] "C" "F" "I"
转置后
t(y)[,1] [,2] [,3][1,] "A" "B" "C"[2,] "D" "E" "F"[3,] "G" "H" "I"
可以看出来就是行变列,列变行了。字符串还是字符串。
2. 数据框转置
2.1 数值型数据框转置
数值型数据框和矩阵差不多,转置不会有太大问题。
x=data.frame(a=1:3,b=4:6,c=7:9)xa b c1 1 4 72 2 5 83 3 6 9
转置后
t(x)[,1] [,2] [,3]a 1 2 3b 4 5 6c 7 8 9
但是转置前是data.frame,转置后的结果是matrix
class(x)[1] "data.frame"class(t(x))[1] "matrix" "array"
2.2 混合型数据框转置
如果data.frame里面既有数值型,又有字符串,t()转置后得到的matrix里面全部都会变成字符串。
x=data.frame(Name=c("A","B","C"),Score=c(70,80,90))xName Score1 A 702 B 803 C 90str(x)'data.frame': 3 obs. of 2 variables:$ Name : chr "A" "B" "C"$ Score: num 70 80 90
可以看到Name是chr类型,Score是num类型 。再来t()转置后看看
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
可以看到原来的Score的数值型被转换成chr字符串类型了,不能再进行针对数值型的操作了。
这个时候如果还希望保持原来的数据类型,则需要用到as.data.frame函数
as.data.frame(t(x))V1 V2 V3Name A B CScore 70 80 90str(as.data.frame(t(x)))'data.frame': 2 obs. of 3 variables:$ V1: chr "A" "70"$ V2: chr "B" "80"$ V3: chr "C" "90"
这时候转化后的Score行里面的数字都是数值型了。
因此,在对保护复杂数据类型的data.frame进行转置时,最好使用as.data.frame(t(x))来操作。
