6 数据操作 - 数组

6.1 简介

Arrow 数组大致相当于 R 向量 - 它可以用来表示单个数据列,所有值具有相同的数据类型。

许多具有 S3 通用方法的 R 基本函数已实现为在 Arrow 数组上工作;例如 meanminmax

6.2 过滤与谓词或掩码匹配的值

您想要搜索数组中与谓词条件匹配的值。

6.2.1 解决方案

my_values <- Array$create(c(1:5, NA))
my_values[my_values > 3]
## Array
## <int32>
## [
##   4,
##   5,
##   null
## ]

6.2.2 讨论

您可以使用方括号 [] 引用数组中的项目,就像您可以引用 R 向量一样。

6.3 计算数组的平均值/最小值/最大值等

您想要计算数组中值的平均值、最小值或最大值。

6.3.1 解决方案

my_values <- Array$create(c(1:5, NA))
mean(my_values, na.rm = TRUE)
## Scalar
## 3

6.3.2 讨论

许多 R 基本通用函数,如 mean()min()max(),已映射到它们的 Arrow 等效项,因此可以以相同的方式在 Arrow 数组对象上调用它们。它们将返回 Arrow 对象本身。

如果您想使用没有 Arrow 映射的 R 函数,您可以使用 as.vector() 将 Arrow 对象转换为 R 基本向量。

arrow_array <- Array$create(1:100)
# get Tukey's five-number summary
fivenum(as.vector(arrow_array))
## [1]   1.0  25.5  50.5  75.5 100.0

您可以通过查看函数的主体来判断一个函数是否是标准 S3 通用函数 - S3 通用函数调用 UseMethod() 来确定要用于该对象的该函数的适当版本。

mean
## function (x, ...) 
## UseMethod("mean")
## <bytecode: 0x564a10424388>
## <environment: namespace:base>

您还可以使用 isS3stdGeneric() 来确定一个函数是否是 S3 通用函数。

isS3stdGeneric("mean")
## mean 
## TRUE

如果您发现一个未为 Arrow 对象实现的 S3 通用函数,但您希望能够使用它,请在项目 JIRA 上打开一个问题

6.4 统计数组中元素出现的次数

您想要统计数组中重复值的次数。

6.4.1 解决方案

repeated_vals <- Array$create(c(1, 1, 2, 3, 3, 3, 3, 3))
value_counts(repeated_vals)
## StructArray
## <struct<values: double, counts: int64>>
## -- is_valid: all not null
## -- child 0 type: double
##   [
##     1,
##     2,
##     3
##   ]
## -- child 1 type: int64
##   [
##     2,
##     1,
##     5
##   ]

6.4.2 讨论

Arrow R 包中的一些函数没有 base R 等效项。在其他情况下,base R 等效项不是泛型函数,因此不能直接在 Arrow Array 对象上调用它们。

例如,Arrow R 包中的 value_counts() 函数与 base R 函数 table() 类似,但它不是泛型函数。

6.5 对数组应用算术函数。

您希望对 Array 对象使用各种算术运算符。

6.5.1 解决方案

num_array <- Array$create(1:10)
num_array + 10
## Array
## <double>
## [
##   11,
##   12,
##   13,
##   14,
##   15,
##   16,
##   17,
##   18,
##   19,
##   20
## ]

6.5.2 讨论

如果您将要添加的值作为 Arrow 对象传入,您将得到相同的结果。

num_array + Scalar$create(10)
## Array
## <double>
## [
##   11,
##   12,
##   13,
##   14,
##   15,
##   16,
##   17,
##   18,
##   19,
##   20
## ]

6.6 直接在数组上调用 Arrow 计算函数

您希望直接在 Array 上调用 Arrow 计算函数。

6.6.1 解决方案

first_100_numbers <- Array$create(1:100)

# Calculate the variance of 1 to 100, setting the delta degrees of freedom to 0.
call_function("variance", first_100_numbers, options = list(ddof = 0))
## Scalar
## 833.25

6.6.2 讨论

您可以使用 call_function() 直接在 Scalar、Array 和 ChunkedArray 对象上调用 Arrow 计算函数。返回的对象将是 Arrow 对象。

6.6.3 另请参阅

有关 Arrow 计算函数的更深入讨论,请参阅关于 在 arrow 中使用 dplyr 动词中的 arrow 函数 的部分。