use*_*015 4 r sum matrix apply
我想知道为什么以下对我在这里发布的矩阵结构不起作用的原因(我使用了dput命令).
当我尝试跑步时:
apply(mymatrix, 2, sum)
Run Code Online (Sandbox Code Playgroud)
我明白了:
Error in FUN(newX[, i], ...) : invalid 'type' (list) of argument
Run Code Online (Sandbox Code Playgroud)
但是,当我检查以确保它是一个矩阵时,我得到以下内容:
is.matrix(myMatrix的)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
我意识到我可以通过将数据列入临时变量然后重新创建矩阵来解决这个问题,但我很好奇为什么会发生这种情况.
?is.matrix
说:
'is.matrix'如果'x'是向量并且具有长度为2的'"dim"属性则返回'TRUE',否则返回'FALSE'.
您的对象是具有dim属性的列表.列表是一种向量(即使它不是原子类型,这是大多数人认为的向量),所以is.matrix
返回TRUE
.例如:
> l <- as.list(1:10)
> dim(l) <- c(10,1)
> is.matrix(l)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
要转换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)
Run Code Online (Sandbox Code Playgroud)
你的矩阵的元素不是numeric
,list
你可以这样做:
apply(m,2, class) # here m is your matrix
Run Code Online (Sandbox Code Playgroud)
因此,如果你想要列总和,你必须"强制"它们numeric
,然后应用colSums
哪个是快捷方式apply(x, 2, sum)
colSums(apply(m, 2, as.numeric)) # this will give you the sum you want.
Run Code Online (Sandbox Code Playgroud)