@PaulHiemstra và @BenBarnes cung cấp câu trả lời đúng. Tôi chỉ muốn thêm vào những lời giải thích của họ.
Vectors vs mảng
Vectors là những cấu trúc dữ liệu cơ bản trong R. Hầu như tất cả mọi thứ được nội biểu diễn dưới dạng một vector, thậm chí danh sách (với ngoại lệ của một loại đặc biệt của danh sách, chấm danh sách cặp, xem ?list
). Mảng chỉ đơn giản là vectơ với thuộc tính được đính kèm, thuộc tính dim
, mô tả kích thước của đối tượng. Hãy xem xét những điều sau đây:
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
Cả v
và a
là chiều dài 10
. Sự khác biệt duy nhất là a
có thuộc tính dim
được đính kèm với nó. Do thuộc tính được thêm vào này, R xử lý a
bên ngoài dưới dạng mảng thay vì vectơ.Sửa đổi chỉ là thuộc tính dim
có thể thay đổi đại diện bên ngoài R của một đối tượng từ mảng vector và trở lại:
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
Trong ví dụ của bạn, temp2
là một đối tượng vector, do đó thiếu một thuộc tính dim
. colMeans
đang mong đợi đối tượng array
có thuộc tính dim
có độ dài ít nhất là 2 (hai chiều). Bạn có thể dễ dàng chuyển đổi temp2
đến một mảng hai chiều với một cột duy nhất:
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() vs nghĩa()
@PaulHiemstra là đúng, thay vì chuyển đổi một vector để một cột duy nhất cho colMeans()
, việc sử dụng mean()
phổ biến hơn trên một vectơ. Tuy nhiên, bạn đúng là colMeans()
nhanh hơn. Tôi tin rằng điều này là bởi vì nó kiểm tra một chút ít hơn cho dữ liệu được định dạng tốt, nhưng chúng tôi sẽ phải xem xét mã C nội bộ để chắc chắn. Hãy xem xét ví dụ sau:
# 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()
trên mảng là nhanh hơn so với mean()
trên hoặc là một vector hoặc một mảng. Tuy nhiên, phần lớn thời gian tăng tốc này sẽ không đáng kể. Tôi thấy rằng tự nhiên hơn khi chỉ sử dụng mean()
trên một mảng vectơ hoặc một cột. Tuy nhiên, nếu bạn là một con quỷ tốc độ thực sự bạn có thể ngủ ngon hơn vào ban đêm khi biết rằng bạn đang tiết kiệm vài trăm mili giây thời gian xử lý bằng cách sử dụng colMeans()
trên các mảng cột đơn thay thế.