# 把一个数字存储到变量my_integer中
<- 5
my_integer
<- 186L
integer_variable
# 把一段文字存储到变量中
<- "Hello, R!" my_string
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()
创建几个变量用于演示:
可以直接用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
<- c(1,2,3)
a is.numeric(a)
## [1] TRUE
NA
表示缺失值,注意不要加引号,加了引号就变成字符型了:
<- NA
dd is.na(dd)
## [1] TRUE
<- "NA"
dd is.na(dd)
## [1] FALSE
is.character(dd)
## [1] TRUE
创建一个数据框用于演示:
<- data.frame(
patientdata 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
创建一个矩阵用于演示:
<- matrix(1:20, nrow=5, ncol=4,
y dimnames = list(c("行1","行2","行3","行4","行5"),
c("列1","列2","列3","列4"))
) is.matrix(y)
## [1] TRUE
创建一个列表用于演示:
<- "My First List" # 字符串
g <- c(25, 26, 18, 39) # 数值型向量
h <- matrix(1:10, nrow=5) # 矩阵
j <- c("one", "two", "three") # 字符型向量
k <- list("apple",1,TRUE) # 列表
l
# 放到1个列表中
<- list(title=g, ages=h, j, k, l)
mylist
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()
数值型向量转换为字符型/因子型/逻辑型:
<- c(1,2,3)
a
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
字符型向量转换:
<- c("你好","我是","阿越")
d
d## [1] "你好" "我是" "阿越"
as.numeric(d) # 错误用法,字符怎么能直接变数字呢?
## Warning: NAs introduced by coercion
## [1] NA NA NA
as.factor(d) # 但是可以变因子
## [1] 你好 我是 阿越
## Levels: 阿越 你好 我是
因子转换:
<- factor(c("你好","我是","阿越"))
f
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