t(x)
给定矩阵或数据框x,t函数返回x的转置。

在对data.frame进行t()操作时需要注意,避免数字变成字符串。

1. 矩阵转置

矩阵里面所有内容都是相同类型数据,使用t()不会有问题。

1.1 数值类型矩阵转置

  1. x=matrix(1:9,3)
  2. x
  3. [,1] [,2] [,3]
  4. [1,] 1 4 7
  5. [2,] 2 5 8
  6. [3,] 3 6 9

转置后

  1. t(x)
  2. [,1] [,2] [,3]
  3. [1,] 1 2 3
  4. [2,] 4 5 6
  5. [3,] 7 8 9

可以看出来就是行变列,列变行了。数值型还是数值型。

1.2 字符串类型矩阵转置

再看看字符串类型的转置

  1. y=matrix(LETTERS[1:9],3)
  2. y
  3. [,1] [,2] [,3]
  4. [1,] "A" "D" "G"
  5. [2,] "B" "E" "H"
  6. [3,] "C" "F" "I"

转置后

  1. t(y)
  2. [,1] [,2] [,3]
  3. [1,] "A" "B" "C"
  4. [2,] "D" "E" "F"
  5. [3,] "G" "H" "I"

可以看出来就是行变列,列变行了。字符串还是字符串。

2. 数据框转置

2.1 数值型数据框转置

数值型数据框和矩阵差不多,转置不会有太大问题。

  1. x=data.frame(a=1:3,
  2. b=4:6,
  3. c=7:9)
  4. x
  5. a b c
  6. 1 1 4 7
  7. 2 2 5 8
  8. 3 3 6 9

转置后

  1. t(x)
  2. [,1] [,2] [,3]
  3. a 1 2 3
  4. b 4 5 6
  5. c 7 8 9

但是转置前是data.frame,转置后的结果是matrix

  1. class(x)
  2. [1] "data.frame"
  3. class(t(x))
  4. [1] "matrix" "array"

2.2 混合型数据框转置

如果data.frame里面既有数值型,又有字符串,t()转置后得到的matrix里面全部都会变成字符串。

  1. x=data.frame(Name=c("A","B","C"),
  2. Score=c(70,80,90))
  3. x
  4. Name Score
  5. 1 A 70
  6. 2 B 80
  7. 3 C 90
  8. str(x)
  9. 'data.frame': 3 obs. of 2 variables:
  10. $ Name : chr "A" "B" "C"
  11. $ Score: num 70 80 90

可以看到Name是chr类型,Score是num类型 。再来t()转置后看看

  1. t(x)
  2. [,1] [,2] [,3]
  3. Name "A" "B" "C"
  4. Score "70" "80" "90"
  5. str(t(x))
  6. chr [1:2, 1:3] "A" "70" "B" "80" "C" "90"
  7. - attr(*, "dimnames")=List of 2
  8. ..$ : chr [1:2] "Name" "Score"
  9. ..$ : NULL

可以看到原来的Score的数值型被转换成chr字符串类型了,不能再进行针对数值型的操作了。

这个时候如果还希望保持原来的数据类型,则需要用到as.data.frame函数

  1. as.data.frame(t(x))
  2. V1 V2 V3
  3. Name A B C
  4. Score 70 80 90
  5. str(as.data.frame(t(x)))
  6. 'data.frame': 2 obs. of 3 variables:
  7. $ V1: chr "A" "70"
  8. $ V2: chr "B" "80"
  9. $ V3: chr "C" "90"

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

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