【问题标题】:Strange behavior of apply-Please correct meapply的奇怪行为-请纠正我
【发布时间】:2014-03-06 04:44:56
【问题描述】:

我有一个生成 0 和 1 矩阵的函数,如下所示:

sim<-function(b,n){
t<-sort(rnorm(n))
p<-sapply(1:length(b),function(i) 1/(1+exp(b[i]-t)))
y<-runif(length(b)*n)
return(ifelse(p>y,1,0))
}

其中b 是一个向量。另一个乐趣被定义为如下操作向量:

SH<-function(x){
it<-sort(sample(1:length(x),ceiling(0.25*length(x))))
x0<-x
x0[it]<-1
return(x0)}

例如,在c(1,1,1,0,0,1,1,0,1,0) 这样的向量上,SH 可能会返回如下内容:

1 1 1 0 1 1 1 1 1 0

现在,使用像这样的b 向量:

b<-seq(-3,3,len=10)

n=50 的结果sim 是一个50 x 10 的矩阵。我尝试将SH 应用于sim 生成的矩阵的行上:

data<-sim(b,50)
data2<-apply(data,1,SH)

apply 返回的矩阵大小为 10 x 50。我认为它应该返回一个大小为 50 x 10 的矩阵,其中行由SH 操作。

我的代码有什么问题?

【问题讨论】:

  • 试试data2&lt;-apply(data,MARGIN = 2,SH)
  • @Alex 您的代码是否将SH 应用于data 的列而不是其行?
  • 是的。对不起,误读了这个例子。我运行了代码,它似乎返回了一个 10 x 50 的矩阵。似乎每一列都是应用于一行数据的 SH 的答案?
  • 啊,答案在? )[MARGIN])' 如果 'n > 1'。即 SH 返回一个长度为 10 的向量,dim(data)[1] 为 50。

标签: r matrix apply


【解决方案1】:

data2 是一个 10 x 50 的矩阵。矩阵的第 i 列是将SH 应用到第 i 行的结果,从 apply 的帮助文件中获得:

  If each call to ‘FUN’ returns a vector of length ‘n’, then ‘apply’
 returns an array of dimension ‘c(n, dim(X)[MARGIN])’ if ‘n > 1’.

要返回大小为 50 x 10 的矩阵,使得每一行对应于将 SH 应用于 data 中的相应行,转置:

data2 = t(apply(data,1,SH))

【讨论】:

  • 这有点奇怪。有没有办法生成与原始矩阵相同维度的操纵矩阵并转置结果?
  • 好吧,实际上这种行为似乎很正常。本质上,apply 返回一个长度等于行数或列数的向量,具体取决于MARGIN 的选择。但是,如果向量的每个元素都是向量本身,则必须决定格式化输出。然而,很可能有不同的应用类型函数。
  • 我明白了。我想出的另一个解决方案,在大矩阵上也比 apply 更快,是使用 sapply 这种形式的 t(sapply(1:50,function(i) SH(data[i,])))
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 2020-05-07
  • 1970-01-01
  • 2016-04-02
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多