分享

R语言基础入门(7)之数据类型的性质

 钟山紫竹林 2022-12-19 发布于辽宁

目录

1.存储模式与基本类型

 2.类属

3.类型转换

4.属性

5.str() 函数

 6.关于赋值


1.存储模式与基本类型

R语言中根据类型可以将数据划分为:

  • 数值型(numeric)
  • 整数型(integer)
  • 字符型(character)
  • 逻辑型(logical)
  • 复数型(complex)
  • 原始型(raw)
R 的变量可以存储多种不同的数据类型,可以用 使用以下函数查看数据的类型,但返回结果有差别
  1. typeof(x)
  2. class(x)
  3. mode()
  4. storage.mode()
比如
整数型:
typeof(1:3)

返回

double 型:

typeof(c(1,2,3))

返回:

逻辑型:

typeof(c(TRUE, NA, FALSE))

返回:

字符串型:

typeof('Abc')

返回:

 注因子返回类型是 integer

typeof(factor(c('F', 'M', 'M', 'F')))

返回:

复数型: 

typeof(2 + 1i) #1不能省略

返回:

原始型(raw):

  1. a <- charToRaw("rlanguage")
  2. #a此时的记录为72 6c 61 6e 67 75 61 67 65,是字符串中每个字符的原始存储格式
  3. a
  4. typeof(a)

返回:

 

为了判断某个向量 x 保存的基本类型,可以用 is.xxx() 类函数,如 is.integer(x), is.double(x),
is.numeric(x) , is.logical(x), is.character(x), is.complex(x), is.raw(x)。其中 is.numeric(x)integerdouble 内容都返回真值。
在 R 语言中数值一般看作 double, 如果需要明确表明某些数值是整数,可以在数值后面附加字母 L ,如
is.integer(c(1, -3))

返回:

is.integer(c(1L, -3L))

返回:

整数型缺失值是 NA ,而 double 型的特殊值除了 NA 外,还包括 Inf, -Inf 和 NaN ,其中 NaN 也是缺失值 , Inf 和 -Inf 不算是缺失值。
对 double 类型,可以用 is.finite() 判断是否有限值, NA 、 Inf , -Inf 和 NaN 都不是有限值;用 is.infinite() 判断是否 Inf 或 -Inf ; is.na() 判断是否 NA 或 NaN ; is.nan() 判断是否 NaN。
如:
c(-1, 0, 1)/0

返回:

 我们来判断一下结果是否为缺失值

is.na(c(-1, 0, 1)/0)

返回:

严格说来, NA 表示逻辑型缺失值,但是当作其它类型缺失值时一般能自动识别。NA_integer_ 是整数型缺失值, NA_real_ 是 double 型缺失值,NA_character_ 是字符型缺失值。
在 R 的向量类型中, integer 类型、 double 类型、 logical 类型、 character 类型、还有 complex 类型和 raw 类型称为原子类型 (atomic types) ,原子类型的向量中元素都是同一基本类型的。比如,double 型向量的元素都是 double 或者缺失值。除了原子类型的向量,在 R 语言的定义中,向量还包括后面要讲到的列表(list ),列表的元素不需要属于相同的基本类型,而且列表的元素可以
不是单一基本类型元素。
typeof() 函数可以返回向量的类型,列表返回结果为"list",如
typeof(list("a", 1L, 1.5))

返回:

 原子类型的各个元素除了基本类型相同,还不包含任何嵌套结构,如:

c(1, c(2,3, c(4,5)))

返回:

 2.类属

R 具有一定的面向对象语言特征,其数据类型有一个 class 属性,函数 class() 可以返回变量类型的类属,可以用 使用以下函数查看数据的 类属,但返回结果有差别 :
  1. typeof(x)
  2. class(x)
  3. mode()
  4. storage.mode()
比如
typeof(factor(c('F', 'M', 'M', 'F')))

返回:

mode(factor(c('F', 'M', 'M', 'F')))

返回:

storage.mode(factor(c('F', 'M', 'M', 'F')))

返回:

class(factor(c('F', 'M', 'M', 'F')))

返回:

class(as.numeric(factor(c('F', 'M', 'M', 'F'))))

返回:

R 有一个特殊的 NULL 类型,这个类型只有唯一的一个 NULL 值,表示不存在。要把 NULL 与 NA 区分开来, NA 是有类型的( integer 、 double 、 logical 、character 等 ), NA 表示存在但是未知。用 is.null() 函数判断某个变量是否取 NULL 。

3.类型转换

可以用 as.xxx() 类的函数在不同类型之间进行强制转换。如
转换为数值型
as.numeric(c(FALSE, TRUE))

返回:

转换为字符型

as.character(sqrt(1:4))

返回:

类型转换也可能是隐含的,比如,四则运算中数值会被统一转换为 double 类 型,逻辑运算中运算元素会被统一转换为 logical 类型。逻辑值转换成数值时,TRUE 转换成 1,FALSE 转换成 0。

在用 c() 函数合并若干元素时,如果元素基本类型不同,将统一转换成最复杂的 一个,复杂程度简单到复杂依次为:logical<integer<double<character
c(FALSE, 1L, 2.5, "3.6")

返回:

 不同类型参与要求类型相同的运算时,也会统一转换为最复杂的类型,如:

TRUE + 10

返回:

paste("abc", 1)

返回:

4.属性

除了 NULL 以外, R 的变量都可以看成是对象,都可以有属性。
在 R 语言中, 属性是把变量看成对象后,除了其存储内容(如元素)之外的其它附加信息,如 维数、类属等。对象 x 的所有属性可以用 attributes() 读取,如
定义x
x <- table(c(1,2,1,3,2,1)); print(x)

返回:

读取x的属性

attributes(x)

返回:

table() 函数用了输出其自变量中每个不同值的出现次数,称为频数。从上例可以看出,table() 函数的结果有三个属性,前两个是 dim 和 dimnames, 这是数组 (array) 具有的属性;另一个是 class 属性,值为 "table" 。因为 x 是数组,可以访问如
  1. x <- table(c(1,2,1,3,2,1))
  2. x[1]

返回:

x["3"]

返回:

 也可以用 attributes() 函数修改属性,如

  1. attributes(x) <- NULL
  2. x

返回:

 如上修改后 x 不再是数组,也不是 table。

class 属性是特殊的。如果一个对象具有 class 属性,某些所谓 “ 通用函数 (generic functions)” 会针对这样的对象进行专门的操作,比如, print() 函数在显示向量和回归结果时采用完全不同的格式。这在其它程序设计语言中称为 “ 重载”(overloading)
可以用 attr(对象, " 属性名") 读取和修改单个属性。向量的元素名是 names 属性,例如
  1. ages <- c(" 李明"=30, " 张聪"=25, " 刘颖"=28)
  2. names(ages)

返回:

attr(ages, "names")

返回:

  1. attr(ages, "names") <- NULL
  2. ages

返回:

 还可以用 unname() 函数返回一个去掉了 names 属性的副本。

5.str() 函数

用 print() 函数可以显示对象内容。如果内容很多,显示行数可能也很多。用 str() 函数可以显示对象的类型和主要结构及典型内容。例如
  1. s <- 101:200
  2. attr(s,'author') <- ' 李小明'
  3. attr(s,'date') <- '2016-09-12'
  4. str(s)

返回:

6.关于赋值

要注意的是,在 R 中赋值本质上是把一个存储的对象与一个变量名联系在一起 (binding),多个变量名可以指向同一个对象。对于基本的数据类型如数值型向量,两个指向相同对象的变量当一个变量被修改时自动制作副本,如
  1. x <- 1:5
  2. y <- x
  3. y[3] <- 0
  4. x

返回:

 

y

返回:

这里如果 y 没有与其它变量指向同一对象,则修改时直接修改该对象而不制作副本。
但是对于有些比较复杂的类型,两个指向同一对象的变量是同步修改的。这样的类型的典型代表是闭包 (closure) ,它带有一个环境,环境的内容是不自动制作副本的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多