2012-09-18 61 views
4

我想知道为什么以下不起作用的矩阵结构我已经发布here(我已经使用了dput命令)。R适用声明不适用矩阵

当我尝试运行:

apply(mymatrix, 2, sum) 

我得到:

Error in FUN(newX[, i], ...) : invalid 'type' (list) of argument 

然而,当我检查,以确保它是一个矩阵,我得到如下:

是。矩阵(mymatrix)

[1] TRUE 

我意识到我可以通过将数据列入临时变量,然后重新创建矩阵来解决此问题,但我很好奇为什么会发生这种情况。

+0

注意的快捷方式错误是不是''时被sum'应用到矩阵的列apply'-相反,它抛出。 (你可以运行'apply(mymatrix,2,identity)'而不会抛出错误) –

+0

@DavidRobinson你可能没有得到一个错误,但你也可能得不到想要的结果。 –

+0

@DWin:我不是说这是一个替代品,我的意思是强调错误被抛出的地方。 –

回答

5

?is.matrix说:

'is.matrix' 返回 'TRUE',如果 'X' 是一个矢量,并且具有 ' “暗淡”' 长度2)和 'FALSE' 的属性否则。

您的对象是一个带有dim属性的列表。列表是一种矢量(尽管它不是原子类型,这是大多数人认为的矢量),所以is.matrix返回TRUE。例如:

> l <- as.list(1:10) 
> dim(l) <- c(10,1) 
> is.matrix(l) 
[1] TRUE 

要转换mymatrix的原子矩阵,你需要做的是这样的:

mymatrix2 <- unlist(mymatrix, use.names=FALSE) 
dim(mymatrix2) <- dim(mymatrix) 
# now your apply call will work 
apply(mymatrix2, 2, sum) 
# but you should really use (if you're really just summing columns) 
colSums(mymatrix2) 
5

你的矩阵的元素不是numeric,相反,他们是list,看到这个你可以这样做:

apply(m,2, class) # here m is your matrix 

所以,如果你想你不得不“要挟”列总和他们是numeric,然后申请colSums这是apply(x, 2, sum)

colSums(apply(m, 2, as.numeric)) # this will give you the sum you want.