我有一个大数据框,我需要从每列中选择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, ]))
})
})
知道如何解决这个问题吗?
谢谢
答案 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]