如何从每列中选择n个顶值并保存相应的行?

时间:2017-03-08 22:38:37

标签: r dataframe lapply

我有一个大数据框,我需要从每列中选择3个最高值(顺序很重要)并保存相应的行号。

names<- c("t1","t10","t11","t2","t3","t4","t5","t6","t7","t8","t9")
values1 <- c(2,3.1,4.5,5.1,6.5,7.1,8.5,9.11,10.1,11.8,12.3)
values2 <- c(1,3.1,3,5.1,6.5,7.1,8.5,9.11,10.1,12,12) 

mydf<- data.frame(names,values1,values2)
#@Juan Bosco has suggested  the followings which is great but gets confuses in this case where I have similar values...
idx <- lapply(2:3, function(col_index) { 
max_values <- sort(mydf[[col_index]], decreasing = T)[1:3]
sapply(max_values, function(one_value){
as.numeric(rownames(mydf[mydf[[col_index]] == one_value, ]))
 })
})

知道如何解决这个问题吗?

谢谢

1 个答案:

答案 0 :(得分:1)

以下返回三个最高值的行号,使用降序排列的sort结果直接子集,假设行名和行号相同。

lapply(2:3, function(col_index) { 
      as.numeric(rownames(mydf[mydf[[col_index]] %in% sort(mydf[[col_index]], decreasing = T)[1:3], ]))
    })

修改

之前的方法以无特定顺序返回行号

以下对代码的添加将按顺序返回具有最高值的行号,从第一个最高值到第三个值。

lapply(2:3, function(col_index) { 
  max_values <- sort(mydf[[col_index]], decreasing = T)[1:3]
  sapply(max_values, function(one_value){
    as.numeric(rownames(mydf[mydf[[col_index]] == one_value, ]))
  })
})

编辑2:

以前的代码不能很好地处理关系。以下是处理关系的方法。

lapply(2:3, function(col_index) { 
  max_values <- sort(mydf[[col_index]], decreasing = T)[1:3]
  max_rows <- sapply(max_values, function(one_value){
    as.numeric(rownames(mydf[mydf[[col_index]] == one_value, ]))
  })

  unique(unlist(max_rows))

})

这引入了一个新问题,您可以使用的三个以上的值结束。处理这个问题的一种快速而肮脏的方法是选择前三个感兴趣的值。

unique(unlist(max_rows))[1:3]