如何获取数据帧每三列的每一行的最大值索引?

时间:2019-01-08 11:21:05

标签: r apply

我想每三列为我的ldf数据帧的每一行找到最大值的索引,并使用结果创建一个数据帧。 在下面我的代码有效。 但是,我想改进它并使其更快。我曾尝试使用apply来遍历ldf的行,但没有成功。

这是我的失败:

ldf<-data.frame(name=c("aa","bb","cc"),V1=c(10,15,10),V2=c(20,10,8),
V3=c(8,8,9),V4=c(20,8,9),V5=c(10,15,8),V6=c(8,10,10))
pos<-NULL
index<-NULL
pos<-apply(ldf,1,function(x){
index<-sapply(seq(2, length(x), 3),function(i){
index<-NULL
cbind(index,which(x[i:(i+2)]==max(x[i:(i+2)]), arr.ind=TRUE)[2])

})
pos<-rbind(pos,index)
})

pos
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA

以下代码可改善预期结果:

ldf<-data.frame(name=c("aa","bb","cc"),V1=c(10,15,10),V2=c(20,10,8),
V3=c(8,8,9),V4=c(20,8,9),V5=c(10,15,8),V6=c(8,10,10))
index<-NULL
pos<-NULL


for(x in 1:dim(ldf)[1]){
index<-sapply(seq(2, dim(ldf)[2], 3),function(i){
index<-NULL
cbind(index,which(ldf[x,i:(i+2)]==max(ldf[x,i:(i+2)]), 
    arr.ind=TRUE)[2])

    })
pos<-rbind(pos,index)
}
pos
      [,1] [,2]
index    2    1
index    1    2
index    1    3

谢谢!

1 个答案:

答案 0 :(得分:0)

有一个内置函数which.max,用于确定最大值的索引。因此,这是逐行应用此功能,然后逐列应用列的问题。基本上是一个循环中的一个循环。

ldf<-data.frame(name=c("aa","bb","cc"),V1=c(10,15,10),V2=c(20,10,8),
                V3=c(8,8,9),V4=c(20,8,9),V5=c(10,15,8),V6=c(8,10,10))


anslist<-lapply(seq(2, 5, 3), function(i){
  apply(ldf[,i:(i+2)], 1, which.max)
})
answer<-t(do.call(rbind, anslist))

do.call函数比为每个结果调用rbind更快的选项。