R 应用的奇怪行为请纠正我

R 应用的奇怪行为请纠正我,r,matrix,apply,R,Matrix,Apply,我有一个生成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)) } 1 1 1 0 1 1 1 1 1 0 b<-seq(-3,3,len=10) 例如,在类似c(1,1,1,0,0,1,1,1,0,1,0

我有一个生成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))
}
1 1 1 0 1 1 1 1 1 0
b<-seq(-3,3,len=10)
例如,在类似
c(1,1,1,0,0,1,1,1,0,1,0)
的向量上,
SH
可能返回如下内容:

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))
}
1 1 1 0 1 1 1 1 1 0
b<-seq(-3,3,len=10)
现在,使用一个
b
向量,如下所示:

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))
}
1 1 1 0 1 1 1 1 1 0
b<-seq(-3,3,len=10)
但是,
apply
返回的矩阵大小为10×50。我认为它应该返回一个大小为50×10的矩阵,其中的行由
SH
操作


我的代码怎么了?

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

  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×10的矩阵,以便每行对应于将
SH
应用到
数据中的相应行,请转置:

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

试试
data2@Alex您的代码不是应用于
SH
数据的列而不是行吗?是的。对不起,误读了这个例子。我运行了代码,它似乎返回一个10乘50的矩阵。似乎每一列都是应用于一行数据的SH的答案吗?啊,答案在?应用:如果对“FUN”的每次调用都返回一个长度为“n”的向量,那么“apply”将返回一个维度为“c(n,dim(X)[MARGIN])”的数组,如果“n>1”。i、 e.SH返回一个长度为10的向量,
dim(data)[1]
是50。这有点奇怪。有没有办法通过转置结果生成与原始矩阵具有相同维数的操纵矩阵?实际上,这种行为似乎很正常。本质上,apply返回一个长度等于行数或列数的向量,具体取决于
边距
的选择。但是,如果向量的每个元素本身就是向量,则必须决定输出的格式。然而,可能有一个不同的应用类型函数。我明白了。我提出的另一个解决方案,在大矩阵上也比
apply
更快,就是使用
sapply
这种形式
t(sapply(1:50,函数(I)SH(数据[I,]))