【问题标题】:R apply statement does not work with a matrixR apply 语句不适用于矩阵
【发布时间】:2012-09-18 17:12:59
【问题描述】:

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

当我尝试跑步时:

apply(mymatrix, 2, sum)

我明白了:

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

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

is.matrix(mymatrix)

[1] TRUE

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

【问题讨论】:

  • 请注意,错误与apply 无关,而是在将sum 应用于矩阵的列时引发。 (你可以运行apply(mymatrix, 2, identity)而不报错)
  • @DavidRobinson 您可能不会收到错误消息,但您也可能无法得到想要的结果。
  • @DWin:我并不是说这是一个替代品——我的意思是强调错误发生在哪里。

标签: r matrix sum apply


【解决方案1】:

?is.matrix 说:

'is.matrix' 返回 'TRUE' 如果 'x' 是一个向量并且有一个 '"dim"' 长度为 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)

【讨论】:

    【解决方案2】:

    你的矩阵元素不是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.
    

    【讨论】:

      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多