聊聊R语言中t转置函数

t()
给定矩阵或数据框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)
x
  a b c
1 1 4 7
2 2 5 8
3 3 6 9

转置后

t(x)
  [,1] [,2] [,3]
a    1    2    3
b    4    5    6
c    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))
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类型,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 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"

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容