4

我想知道为什么以下不适用于我在此处发布的矩阵结构(我使用了 dput 命令)。

当我尝试运行时:

apply(mymatrix, 2, sum)

我得到:

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

但是,当我检查以确保它是一个矩阵时,我得到以下信息:

is.matrix(mymatrix)

[1] TRUE

我意识到我可以通过将数据取消列出到临时变量中然后重新创建矩阵来解决这个问题,但我很好奇为什么会这样。

4

2 回答 2

5

?is.matrix说:

如果“x”是一个向量并且具有长度为 2 的“dim”属性,则“is.matrix”返回“TRUE”,否则返回“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)
于 2012-09-18T17:35:59.653 回答
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.
于 2012-09-18T17:40:43.173 回答