独立选择每一列而不是行号时如何保存行名?

How to save row names when selecting each column independently instead of row number?

几天前我问了这个问题,@Juan Bosco 帮助了我并建议了完美运行的代码,并从每一列中选择了前 n 个值。但事实证明我需要每一列的每个选定行的名称,所以在列表中:"Selectedrows",我需要像 "t9"、"t8"、"t7" 这样的东西而不是行数字。

 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)


Selectedrows<- 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))[1:3]

})

谢谢

在这种情况下,可以使用order,其中returns索引可用于对数组进行排序,order结果中的前三个元素对应于前 3 个值的索引(如果您指定要递减的数组);使用索引,您可以对 names 列进行子集并获得相应的值:

lapply(2:3, function(col_index) {
    mydf[["names"]][order(mydf[[col_index]], decreasing = T)[1:3]]
})

#[[1]]
#[1] "t9" "t8" "t7"

#[[2]]
#[1] "t8" "t9" "t7"

请注意,如果不是,则假设您的姓名列是字符。如果您希望结果是字符而不是因子,请先执行 mydf$names <- as.character(mydf$names)