繁体   English   中英

R - 用apply系列中的函数替换双循环

[英]R - Replace a double loop by a function from the apply family

我有这些循环:

xall = data.frame()
for (k in 1:nrow(VectClasses))
{
for (i in 1:nrow(VectIndVar))
  {
   xall[i,k] = sum(VectClasses[k,] == VectIndVar[i,])
  }
}

数据:

VectClasses =包含每个类的特征的数据框

VectIndVar =包含数据库的每条记录的数据框

两个for循环工作并提供我可以使用的输出,但是,它需要太长时间,因此我需要apply系列

我正在寻找的输出是这样的:

    V1 V2 V3 V4
 1  3  3  2  2
 2  2  2  1  1
 3  3  4  3  3
 4  3  4  3  3
 5  4  4  3  3
 6  3  2  3  3

我试过用:

xball = data.frame()
xball = sapply(xball, function (i,k){
 sum(VectClasses[k,] == VectIndVar[i,])})

xcall = data.frame()
xcall = lapply(xcall, function (i, k){sum(VectClasses[k,] == VectIndVar[i,]} )

但似乎都没有填补数据框架

可再现数据(缩短):

VectIndVar <- data.frame(a=sample(letters[1:5], 100, rep=T), b=floor(runif(100)*25), 
 c = sample(c(1:5), 100, rep=T), 
 d=sample(c(1:2), 100, rep=T))

并且:

> K1 = 4
VectClasses= VectIndVar [sample(1:nrow(VectIndVar ), K1, replace=FALSE), ]

你能帮助我吗?

我会使用outer而不是*apply

res <- outer( 
  1:nrow(VectIndVar), 
  1:nrow(VectClasses),
  Vectorize(function(i,k) sum(VectIndVar[i,-1]==VectClasses[k,-1]))
)

(感谢此问答以澄清需要Vectorize 。)

这给了

> head(res) # with set.seed(1) before creating the data
     [,1] [,2] [,3] [,4]
[1,]    1    1    2    1
[2,]    0    0    1    0
[3,]    0    0    0    0
[4,]    0    0    1    0
[5,]    1    0    0    1
[6,]    1    1    1    1

至于速度,我建议使用矩阵而不是data.frames:

cmat <- as.matrix(VectClasses[-1]); rownames(cmat)<-VectClasses$a
imat <- as.matrix(VectIndVar[-1]);  rownames(imat)<-VectIndVar$a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM