Как получить индекс максимума каждой строки каждые три столбца кадра данных? - PullRequest
0 голосов
/ 08 января 2019

Я хотел бы найти индекс max для каждой строки моего файла данных в формате 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 голосов
/ 08 января 2019

Имеется встроенная функция 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 для каждого отдельного результата.

...