对于R语言的数据框结构的数据而言,如果我们只提取一列的话,我们可以通过取子集的方式,这样取的子集本身也是一个向量
library(survival)
data("pbc")
is.vector(pbc[1])
## [1] FALSE
is.vector(pbc$id)
## [1] TRUE
但是如果我们我们只去一行的话,那索引的方式去到的子集返回的还是一个数据框。
is.vector(pbc[1,])
## [1] FALSE
is.data.frame(pbc[1,])
## [1] TRUE
那怎么才能把一行转换为向量呢?之前一直都是想着,那既然行不行。那我就转换成列来取呗。所以就用了下面的操作
example <- t(pbc)[,1]
is.vector(example)
## [1] TRUE
这个方式,在数据量很小的时候使用是可以的。但是如果数据集很大。整个转置的过程就是一个耗时的过程。而如果我们使用
example <- t(pbc[1,])[,1]
is.vector(example)
## [1] TRUE
又十分的繁琐。要解决这个问题,其实要明白。数据框其实是一种可以算作一种特殊类型的list。别的list因为每个分类下面可能包括不同的长度或者不同的数据类型。数据框只是一个长度相同的同时又是向量的list。而且数据框是以列作为list的分类的。所以其实我们取一列就相当于取了一个list下的整个向量。反而取一行相当于在list的每个分类下各取了一个。因此其实我们使用unlist就可以解决问题
example <- unlist(pbc[1,])
is.vector(example)
## [1] TRUE
这样的取法是的向量包括列名。如果我们也不想要列名。那就可以
example
## id time status trt age sex
## 1.00000 400.00000 2.00000 1.00000 58.76523 2.00000
## ascites hepato spiders edema bili chol
## 1.00000 1.00000 1.00000 1.00000 14.50000 261.00000
## albumin copper alk.phos ast trig platelet
## 2.60000 156.00000 1718.00000 137.95000 172.00000 190.00000
## protime stage
## 12.20000 4.00000
unlist(pbc[1,], use.names = F)
## [1] 1.00000 400.00000 2.00000 1.00000 58.76523 2.00000
## [7] 1.00000 1.00000 1.00000 1.00000 14.50000 261.00000
## [13] 2.60000 156.00000 1718.00000 137.95000 172.00000 190.00000
## [19] 12.20000 4.00000
这样转换同时也需要注意的是,unlist会把factor转换为数字。。。