8  类型判断和转换

8.1 类型判断

每种类型都有一个判断类型的函数,以下是常见的几个:

is.numeric()   # 是不是数值型?
is.character()
is.double()
is.integer()
is.factor()
is.complex()
is.logical()
is.na() 

is.data.frame() # 是不是data.frame
is.array()
is.matrix()
is.list()

创建几个变量用于演示:

# 把一个数字存储到变量my_integer中
my_integer <- 5

integer_variable <- 186L

# 把一段文字存储到变量中
my_string <- "Hello, R!"

可以直接用class()或者typeof()

# 查看变量的类型
class(my_integer)
## [1] "numeric"
class(integer_variable)
## [1] "integer"
class(my_string)
## [1] "character"

还可以使用is.xxx()判断是不是属于某种类型,比如查看my_integer的类型:

is.numeric(my_integer) # 是数值型吗?是的,返回TRUE
## [1] TRUE
is.logical(my_integer)  # 是逻辑型吗?不是,返回FLASE
## [1] FALSE
a <- c(1,2,3)
is.numeric(a)
## [1] TRUE

NA表示缺失值,注意不要加引号,加了引号就变成字符型了:

dd <- NA
is.na(dd)
## [1] TRUE

dd <- "NA"
is.na(dd)
## [1] FALSE
is.character(dd)
## [1] TRUE

创建一个数据框用于演示:

patientdata <- data.frame(
  patientID = c(1, 2, 3, 4), 
  age = c(25, 34, 28, 52), 
  diabetes = c("Type1", "Type2", "Type1", "Type1"), 
  status = c("Poor", "Improved", "Excellent", "Poor")
  )

is.data.frame(patientdata)
## [1] TRUE

创建一个矩阵用于演示:

y <- matrix(1:20, nrow=5, ncol=4,
            dimnames = list(c("行1","行2","行3","行4","行5"),
                            c("列1","列2","列3","列4"))
            ) 
is.matrix(y)
## [1] TRUE

创建一个列表用于演示:

g <- "My First List" # 字符串
h <- c(25, 26, 18, 39) # 数值型向量
j <- matrix(1:10, nrow=5) # 矩阵
k <- c("one", "two", "three") # 字符型向量
l <- list("apple",1,TRUE) # 列表

# 放到1个列表中
mylist <- list(title=g, ages=h, j, k, l)

is.list(mylist)
## [1] TRUE
#is.vector(mylist)

8.2 类型转换

不同的变量之间可以相互转换。常见的类型转换函数:

as.numeric()   # 变成数值型
as.character()
as.double()
as.integer()
as.factor()
as.complex()
as.logical()

as.data.frame() # 变成数据框
as.array()
as.matrix()
as.list()

数值型向量转换为字符型/因子型/逻辑型:

a <- c(1,2,3)
a
## [1] 1 2 3

as.character(a) # 变成字符型
## [1] "1" "2" "3"
as.factor(a)    # 变成因子型
## [1] 1 2 3
## Levels: 1 2 3
as.logical(a)   # 变成逻辑型,无意义
## [1] TRUE TRUE TRUE

字符型向量转换:

d <- c("你好","我是","阿越")
d
## [1] "你好" "我是" "阿越"

as.numeric(d) # 错误用法,字符怎么能直接变数字呢?
## Warning: NAs introduced by coercion
## [1] NA NA NA
as.factor(d) # 但是可以变因子
## [1] 你好 我是 阿越
## Levels: 阿越 你好 我是

因子转换:

f <- factor(c("你好","我是","阿越"))
f
## [1] 你好 我是 阿越
## Levels: 阿越 你好 我是

as.numeric(f) # 直接变数字
## [1] 2 3 1
as.character(f)
## [1] "你好" "我是" "阿越"

矩阵转换:

as.data.frame(y)
##     列1 列2 列3 列4
## 行1   1   6  11  16
## 行2   2   7  12  17
## 行3   3   8  13  18
## 行4   4   9  14  19
## 行5   5  10  15  20
#as.list(y) # 太长不演示
as.numeric(y)
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
as.factor(y)
##  [1] 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
## Levels: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
as.character(y)
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15"
## [16] "16" "17" "18" "19" "20"

数据框转换:

as.matrix(patientdata)
##      patientID age  diabetes status     
## [1,] "1"       "25" "Type1"  "Poor"     
## [2,] "2"       "34" "Type2"  "Improved" 
## [3,] "3"       "28" "Type1"  "Excellent"
## [4,] "4"       "52" "Type1"  "Poor"
as.list(patientdata)
## $patientID
## [1] 1 2 3 4
## 
## $age
## [1] 25 34 28 52
## 
## $diabetes
## [1] "Type1" "Type2" "Type1" "Type1"
## 
## $status
## [1] "Poor"      "Improved"  "Excellent" "Poor"
as.character(patientdata)
## [1] "c(1, 2, 3, 4)"                                     
## [2] "c(25, 34, 28, 52)"                                 
## [3] "c(\"Type1\", \"Type2\", \"Type1\", \"Type1\")"     
## [4] "c(\"Poor\", \"Improved\", \"Excellent\", \"Poor\")"
# as.numeric(patientdata) # 错误
# as.factor(patientdata) # 错误

列表转换:

# as.data.frame(mylist) # 报错
as.matrix(mylist)
##       [,1]           
## title "My First List"
## ages  numeric,4      
##       integer,10     
##       character,3    
##       list,3