【问题标题】:force "apply" to return a matrix?强制“应用”返回一个矩阵?
【发布时间】:2015-10-30 07:14:46
【问题描述】:

假设我有一个数据矩阵,我想先将矩阵按行居中,然后按列计算平均值。

a=matrix(runif(50),nrow=5)
a1=apply(a,1,function(x)x-mean(x))
a.sum=apply(a1,1,sum)

a 有多个列时,这很有效。但是,有时输入只有一列,这会造成麻烦:

a=matrix(runif(5))
a1=apply(a,1,function(x)x-mean(x))
a.sum=apply(a1,1,sum)
Error in apply(a1, 1, sum) : dim(X) must have a positive length

这是因为第一个 apply 返回的是向量,而不是矩阵。 R 自动删除了维度。那么有没有聪明的方法来防止这种情况呢?我知道我可以使用if 来检测a 的维度并使用不同的编码对其进行处理。但这似乎有点尴尬。

【问题讨论】:

  • 试试do.call(cbind,apply(a, 1, function(x) list(x- mean(x))))t(apply(a, 1, function(x) x- mean(x)))
  • a1 只是一个零向量,所以不确定要做什么。尽管我首先会将您的整个过程转换为rowSums(scale(t(a), scale = FALSE))。或者只是colSums(a - rowMeans(a)),两者都应该适用于您的向量。

标签: r


【解决方案1】:

告诉 R 它是一个矩阵:

a=matrix(runif(5))
#          [,1]
#[1,] 0.0103764
#[2,] 0.9738857
#[3,] 0.2845688
#[4,] 0.7050949
#[5,] 0.3000554

a1=as.matrix(apply(a,1,function(x)x-mean(x)))
#     [,1]
#[1,]    0
#[2,]    0
#[3,]    0
#[4,]    0
#[5,]    0

a.sum=apply(a1,1,sum)
#[1] 0 0 0 0 0

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多