HOWTO · R

检查 R 中的变量数据类型

本教程演示如何在 R 中检查变量类型。

本页内容

在 R 中检查变量时,应根据想了解的信息选择函数:typeof() 报告底层存储类型,class() 报告对象的类,str() 概述对象结构,而 is.numeric() 等判断函数会返回 TRUE 或 FALSE。这些函数只检查对象,不会改变其类型。

为单个 R 对象选择 typeof() 或 class()

需要了解 R 用来存储对象的基本类型时,使用 typeof();需要了解影响泛型函数如何处理对象的类时,使用 class()。对象的存储类型和类可能不同,因此区分两者很重要。例如,因子以整数编码存储,但其类是 "factor"。

运行以下示例。代码及其中可读的标签和输出保持英文:

本节中的代码以及显示的标签或输出仍为英文。

scores <- factor(c("low", "high", "low"))
print(typeof(scores))
print(class(scores))

这两个调用从不同角度检查同一个对象。typeof() 报告底层表示;class() 报告因子类,而这个类赋予这些值类别型行为。对于常见的数值向量和字符向量,两者的结果可能看起来相似,但它们回答的是不同的问题。

使用 str() 检查数据框的每一列

要快速了解数据框的结构,可以使用 str()。它会列出行数和列数,并概述每一列,包括其存储类型和少量示例值。在为单独的列选择转换方式或类型检查方法之前,这样做很有帮助。该函数会打印摘要,不会更改数据框。

运行以下示例。代码及其中可读的标签和输出保持英文:

本节中的代码以及显示的标签或输出仍为英文。

people <- data.frame(
  name = c("Ari", "Bo"),
  visits = c(3L, 5L),
  active = c(TRUE, FALSE)
)
str(people)

在摘要中查看列名和类型缩写:字符值显示为 chr,整数值显示为 int,逻辑值显示为 logi。R 可能会将普通的整数外观数值存储为 num;如果整数存储很重要,请使用 3L 这样的整数常量。

检查对象或列是否为特定类型

类型判断函数用于回答对象是否符合某项条件。例如,is.numeric() 检查对象是否为数值型,is.character() 检查对象是否为字符数据,而 is.integer() 则专门检查整数存储类型。每个函数都会返回一个 R 逻辑值:TRUE 或 FALSE。像 3 这样的数值通常存储为双精度类型,因此 is.integer(3) 的结果是 FALSE;使用 3L 可以创建整数常量。

运行以下示例。代码及其中可读的标签和输出保持英文:

本节中的代码以及显示的标签或输出仍为英文。

value <- 3L
labels <- c("new", "returning")
people <- data.frame(visits = c(3, 5), name = c("Ari", "Bo"))

print(is.integer(value))
print(is.character(labels))
print(is.numeric(people$visits))
print(is.character(people$name))

使用 $ 或 [[ ]] 将数据框的一列传给判断函数。返回结果适用于所选列整体;它不会逐个检查单元格是否具有不同类型。如果对象的存储类型或类不符合函数的具体定义,即使其值看起来与目标类型相似,判断结果也可能是 FALSE。

使用 sapply() 将类型函数应用于元素或列

使用 sapply() 可以将函数应用于集合中的每个项目,并在可能时简化结果。对于数据框,它会逐列迭代,因此应用 typeof() 会为每一列报告一个存储类型。对于原子向量,R 通常会将所有元素强制转换为同一种类型;因此,逐个元素应用类型函数无法找回强制转换时已丢失的原始类型差异。

运行以下示例。代码及其中可读的标签和输出保持英文:

本节中的代码以及显示的标签或输出仍为英文。

people <- data.frame(
  name = c("Ari", "Bo"),
  visits = c(3L, 5L),
  active = c(TRUE, FALSE)
)
column_types <- sapply(people, typeof)
print(column_types)

这里,sapply() 会对每一列调用一次 typeof(),并将结果放入带名称的向量中。如果你想判断每一列是否符合某项条件,可以改用类型判断函数,例如 sapply(people, is.character)。对于复杂或混合类型的集合,可以使用 str() 检查结构,或显式迭代,以便清楚了解结果的形状。

对单个对象,使用 typeof() 检查存储类型,使用 class() 检查对象的类,使用 str() 查看结构;需要回答是非问题时使用判断函数,需要跨列应用检查时使用 sapply()。随附的运行记录包含四个示例的观测结果。