2017-03-08 44 views
0

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

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

如何为名称列定义“最高值”?其余的,因为它们是数字的,你可以使用'max'。 –

+0

只要能跟踪行号,我就可以删除该列。但'最大'给出一个单一的值,对吧?我想要顶级的。 @Juan Bosco – Jack

回答

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] 
+0

这个工程,但我需要的结果按价值排序,而不是现在的行号。换句话说,我希望每列的第一高,第二高和第三高,这个顺序很重要。 @Juan Bosco – Jack

+0

@Jack我添加了一个应该按顺序返回行号的编辑。 –

+0

感谢您的帮助@Juan Bosco。这很棒,但当我们有两个相同的值时,它会变得混乱! – Jack

相关问题