我想每三列为我的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
谢谢!
答案 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更快的选项。