@PaulHiemstra 和 @BenBarnes 提供了正确的答案。我只是想补充他们的解释。
向量与数组
向量是 R 中的基本数据结构。几乎所有内容在内部都表示为向量,甚至是列表(除了一种特殊的列表,点对列表,请参阅 参考资料?list
)。数组只是带有附加属性的向量,该dim
属性描述了对象的尺寸。考虑以下:
v <- c(1:10)
a <- array(v, dim = c(5, 2))
length(v) # 10
length(a) # 10
attributes(v) # NULL
attributes(a) # $dim 10 1
is.vector(v) # TRUE
is.array(v) # FALSE
is.vector(a) # FALSE
is.array(a) # TRUE
两者都是v
长度。唯一的区别是附加了属性。由于这个附加属性,R在外部将其视为数组而不是向量。仅修改属性可以将 R 的对象的外部表示从数组更改为向量并返回:a
10
a
dim
a
dim
attr(a, "dim") <- NULL
is.vector(a) # TRUE
is.array(a) # FALSE
attr(v, "dim") <- c(5, 2)
is.vector(v) # FALSE
is.array(v) # TRUE
在您的示例中,temp2
是一个矢量对象,因此缺少dim
属性。colMeans
期望具有至少长度为 2(二维)array
的属性的对象。dim
您可以轻松地转换temp2
为具有单列的二维数组:
temp3 <- array(temp2, dim = c(length(temp2), 1))
# or:
temp4 <- temp2
attr(temp4, "dim") <- c(length(temp2), 1)
is.array(temp2) # FALSE
is.array(temp3) # TRUE
is.array(temp4) # TRUE
colMeans() 与 mean()
@PaulHiemstra 是对的,与其将向量转换为单列 for colMeans()
,不如仅在向量上使用更为常见mean()
。但是,您是对的,colMeans()
速度更快。我相信这是因为它对格式正确的数据的检查少了一点,但我们必须查看内部 C 代码才能确定。考虑这个例子:
# Create vector "v" and array "a"
n <- 10e7
set.seed(123) # Set random number seed to ensure "v" and "a[,1]" are equal
v <- runif(n)
set.seed(123) # Set random number seed to ensure "v" and "a[,1]" are equal
a <- array(runif(n), dim=c(n, 1))
# Test that "v" and "a[,1]" are equal
all.equal(v, a[,1]) # TRUE
# Functions to compare
f1 <- function(x = v){mean(x)} # Using mean on vector
f2 <- function(x = a){mean(x)} # Using mean on array
f3 <- function(x = a){colMeans(x)} # Using colMeans on array
# Compare elapsed time
system.time(f1()) # elapsed time = 0.344
system.time(f2()) # elapsed time = 0.366
system.time(f3()) # elapsed time = 0.166
colMeans()
在数组上比mean()
在向量或数组上更快。但是,大多数情况下,这种加速可以忽略不计。我发现只mean()
在向量或单列数组上使用更自然。colMeans()
但是,如果你是一个真正的速度恶魔,你可能会在晚上睡得更好,因为你知道通过使用单列数组可以节省数百毫秒的处理时间。