2013-03-07 34 views
3

假设我有一个非常大的data.frame,其中包含每列的分数。对列进行排名,并以最高分作为第一列等

例如:

MA0001.1 AGL3 MA0003.1 TFAP2A MA0004.1 Arnt MA0005.1 AG MA0006.1 Arnt::Ahr 
7.789524e-09 0.4012127249 3.771518e-03 1.892011e-06 0.002733200 
5.032498e-07 0.0001873801 9.947449e-05 3.284222e-05 0.001367041 
1.194487e-06 0.0009357406 6.943634e-05 1.589373e-05 0.002551519 
4.833494e-06 0.0150703600 1.003488e-04 1.197928e-03 0.001431416 
6.865040e-05 0.0000732607 3.857193e-04 5.388744e-03 0.001363706 

[R data.frame:

testfr<-structure(list(`MA0001.1 AGL3` = c(7.78952366977488e-09, 5.03249791215203e-07, 
1.19448739380034e-06, 4.83349413748598e-06, 6.86504034402563e-05 
), `MA0003.1 TFAP2A` = c(0.401212724871542, 0.000187380067026448, 
0.000935740631438077, 0.0150703600158589, 7.32607018758816e-05 
), `MA0004.1 Arnt` = c(0.00377151826447817, 9.94744903768433e-05, 
6.94363387424972e-05, 0.000100348764966112, 0.00038571926458373 
), `MA0005.1 AG` = c(1.89201084302835e-06, 3.2842217133538e-05, 
1.58937284554136e-05, 0.00119792816070882, 0.00538874414923338 
), `MA0006.1 Arnt::Ahr` = c(0.00273319966783363, 0.00136704060025893, 
0.00255151921946167, 0.00143141576426544, 0.00136370552325235 
)), .Names = c("MA0001.1 AGL3", "MA0003.1 TFAP2A", "MA0004.1 Arnt", 
"MA0005.1 AG", "MA0006.1 Arnt::Ahr"), class = "data.frame", row.names = c(4L, 
2L, 5L, 1L, 3L)) 

现在我想选择含有最高值的列和第一放置该列。 因此,1列的值应该保持在同一列名下面,并且整列应该按等级移动。

我尝试以下:

ranked<-unlist(lapply(testfr,rank)) 
testranked<-testfr[ranked, ] 

这产生的数据帧与2259obs * 459vars而原来为5×459。

请注意,testfr是一个从函数派生的data.frame,它将序列评分到矩阵列表中!并将该分数返回到数据框中,其中行是序列,列是矩阵。

我知道我做错了索引或unlisting但我没有任何线索如何解决此问题。任何帮助表示赞赏。

回答

7

这个怎么样?

> testfr[rev(order(sapply(testfr, max, na.rm = TRUE)))] 

细分:

sapply(test.fr, max, na.rm = TRUE) # get max of each column (after removing NA) 
order(.) # get the order of these values in increasing order 
rev(.) # get the reverse order so that highest value index stays first 
testfr[.] # get the columns in this order back 
+0

很好的链接功能:) – 2013-03-07 11:29:49

+0

@阿伦确实很好的链接功能。但是,将其应用于测试数据集时,我仍然认为输出结果不正确。因为列不会最大限度地改变。并且旧框架column.names的顺序与新框架的顺序相同,只有值是有序的,但不是列 – 2013-03-07 11:48:12

+0

@SanderVanderZeeuw,您的data.frame中有“NA”值吗? – Arun 2013-03-07 12:09:24

1

我会用apply的可读性,

testfr[order(apply(testfr, 2, max, na.rm = TRUE),decreasing=T)] 

我申请最高为每保证金,列在这里,然后我排序按递减顺序列。

+1

但它会在“应用”之前内部转换为“矩阵”。我不明白为什么要使用'apply' ...感谢按顺序选择'递减= TRUE'。 – Arun 2013-03-07 12:17:34

+0

@agstudy感谢您的其他选择!我会看看它。但阿伦是第一个,所以我会接受他的答案为正确的1.你也可以给我一个解释你为什么选择减少?因为我想选择最高的分数 – 2013-03-07 12:18:56

+0

@Arun我认为它有一个data.frame不是一个列表,所以使用'apply'对我来说很自然。 – agstudy 2013-03-07 12:21:35

相关问题