我想知道以下内容对我发布的here矩阵结构不起作用的原因(我使用了dput命令)。
当我尝试跑步时:
apply(mymatrix, 2, sum)
我明白了:
Error in FUN(newX[, i], ...) : invalid 'type' (list) of argument
然而,当我检查以确保它是一个矩阵时,我得到以下内容:
is.matrix(myMatrix的)
[1] TRUE
我意识到我可以通过将数据列入临时变量然后重新创建矩阵来解决这个问题,但我很好奇为什么会发生这种情况。
答案 0 :(得分:5)
?is.matrix
说:
'is.matrix'如果'x'是向量并且具有'“dim”',则返回'TRUE' 长度为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)
答案 1 :(得分: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.