colMeans在R中运行并遇到大小为1的列的问题

dog*_*hat 7 r

我有一个关于colMeans功能的问题.是否有一个版本,当它遇到长度为1的列时不会返回错误?例如

temp<-cbind(c(2,2),c(3,4))
colMeans(temp)

[1] 2.0 3.5
Run Code Online (Sandbox Code Playgroud)

但对于这一个

temp2<-c(2,2)
colMeans(temp2)

Error in colMeans(temp2) : 
'x' must be an array of at least two dimensions
Run Code Online (Sandbox Code Playgroud)

但是,如果我将函数mean应用于每一列,它会正确地得到值2和2.

我写了一个函数来做到这一点

testfun<-function(i,x){
mean(x[,i])
}
sapply(1:ncol(x),testfun,x)
Run Code Online (Sandbox Code Playgroud)

它给出与colMeans相同的结果.
我听说colMeans应该比这种方法快得多.那么,当我的列大小为1时,是否有一个colMeans版本可以使用.

Ben*_*nes 8

正如@Paul指出的那样,colMeans它的x参数(from ?colMeans)需要"一个包含两个或更多维度的数组" .但temp2不是阵列

is.array(temp2)
# [1] FALSE
Run Code Online (Sandbox Code Playgroud)

temp2 可以组成一个数组:

(tempArray <- array(temp2, dim = c(1, 2)))
#      [,1] [,2]
# [1,]    2    2

colMeans(tempArray)
# [1] 2 2
Run Code Online (Sandbox Code Playgroud)

也许temp2来自子集化数组,例如

array(temp2, dim = c(2, 2))[1, ]
Run Code Online (Sandbox Code Playgroud)

但这不是阵列.要将其保留为数组,请drop = FALSE在括号内添加:

array(temp2, dim = c(2, 2))[1, , drop = FALSE]
#      [,1] [,2]
# [1,]    2    2
Run Code Online (Sandbox Code Playgroud)

然后,您可以在子集阵列上使用colMeans.