2013-05-06 30 views
2

我有一个数据帧,看起来像这样:提取物列了一个数据帧,并责令其

structure(list(Mash_pear = c(0.192474082559755, 0.679726904159742, 
0.778564545349054, 0.573745352397321, 0.56633658385284, 0.472559997318901, 
0.462635414367878, 0.562128414492567, 0.354624921832056, 0.64532681437697 
), tRap_pear = c(0.0350096175177328, 0.234255507711743, 0.23714999195134, 
0.185536020521134, 0.191585098617356, 0.201402054387186, 0.220911538536031, 
0.216072802572045, 0.132247101763063, 0.172753098431029), Beeml_pear = c(0.179209909971615, 
0.79129167285928, 0.856908302056589, 0.729078080521886, 0.709346164378725, 
0.669599784720647, 0.585348196746785, 0.639355942917055, 0.544909349368496, 
0.794652394149651), Mash_pear2080 = c(0.823944540480775, 0.816630852343513, 
0.81134728399675, 0.801065036203532, 0.799630945085954, 0.799195606444727, 
0.798637867344115, 0.798478922129054, 0.798090734787886, 0.797673368802285 
)), .Names = c("Mash_pear", "tRap_pear", "Beeml_pear", "Mash_pear2080" 
), row.names = c("Aft1", "Alx3_3418.2", "Alx4_1744.1", "Arid3a_3875.1_v1_primary", 
"Arid3a_3875.1_v2_primary", "Arid3a_3875.2_v1_primary", "Arid3a_3875.2_v2_primary", 
"Arid5a_3770.2_v1_primary", "Arid5a_3770.2_v2_primary", "Aro80" 
), class = "data.frame") 

现在我有了想法到排名的成绩,但每列应该分别与保持排名行名完好无损。 所以我试图提取所有的列1 1,并命令他们。我试图订购1列时遇到的问题正在发生。即我的数据框消失,并成为数值的向量,正如我已经指出的,我需要数据框架(rownames)保持原样,只有有序。我的工作,现在的代码是在这里:

rowname<-rownames(pearframe) 
col1<-subset(pearframe, select=1)[order(pearframe),] 
col2<-subset(pearframe, select=2)[order(pearframe),] 
col3<-subset(pearframe, select=3)[order(pearframe),] 
col4<-subset(pearframe, select=4)[order(pearframe),] 

这消除了我的rownames和原单数据帧结构。这使得我无法对我的数据进行排名。所以实际的问题是:我如何为每列排序/排序数据框,并创建4个新框架,每个框架有1个有序列。最终我想要有一张表,其中存在每个排名帧和分数的rownames。

+0

您的预期输出是什么? – Nishanth 2013-05-06 12:22:08

+0

具有1列的4个数据帧。所以每一列都应该成为一个新的数据框,其中有一列数字值和旧数据框的rownames – 2013-05-06 12:22:57

+0

你想要什么最终结果?你在最后描述的表格,那是什么? – Thomas 2013-05-06 12:27:01

回答

4

另一种方法是取一个data.frame只是一堆列表的事实的好处。您可以使用lapply,这会给你一个data.frames的列表。如果您愿意,可以通过列名访问每个列表并将其分配给新的df:

ranks <- lapply(df , function(x) data.frame(rank = rownames(df)[ order(x) ] , score = x[ order(x) ])) 
names(ranks) <- names(df) 

head(ranks[["Mash_pear"]]) 
#      rank  score 
#1      Aft1 0.1924741 
#2 Arid5a_3770.2_v2_primary 0.3546249 
#3 Arid3a_3875.2_v2_primary 0.4626354 
#4 Arid3a_3875.2_v1_primary 0.4725600 
#5 Arid5a_3770.2_v1_primary 0.5621284 
#6 Arid3a_3875.1_v2_primary 0.5663366 

head(ranks[["tRap_pear"]]) 
#      rank  score 
#1      Aft1 0.03500962 
#2 Arid5a_3770.2_v2_primary 0.13224710 
#3     Aro80 0.17275310 
#4 Arid3a_3875.1_v1_primary 0.18553602 
#5 Arid3a_3875.1_v2_primary 0.19158510 
#6 Arid3a_3875.2_v1_primary 0.20140205 
+1

'cbind'使它们成为字符矩阵,看起来像。 – Frank 2013-05-06 12:35:46

+0

好吧,但检查第二列我没有看到任何分数排序/排序。那是因为你选择先订购?进一步对我来说是一个很好的解决方案,因为现在玩专栏会变得更容易! – 2013-05-06 12:35:48

+0

@Frank你是abosultely正确的,谢谢! Shuold使用了'data.frame'! – 2013-05-06 12:38:50

4

你需要使用drop=FALSE两次,我想:

subset(pearframe, select=1,drop=FALSE)[order(pearframe[,1]),,drop=FALSE] 

其他案件看起来是一样的,递增1看来这两个地方。

编辑:另外,这是更简洁:

pearframe[order(pearframe[,1]),1,drop=FALSE] 

EDIT2:这是如何让您的最终data.frame这种方法:

col_list <- list() 
for (i in 1:4){ 
    col_list[[i]] <- pearframe[order(pearframe[,i]),i,drop=FALSE] 
    col_rnname <- paste(names(pearframe)[[i]],"rn",sep=".") 
    col_list[[i]][[col_rnname]] <- rownames(col_list[[i]]) 
    rownames(col_list[[i]]) <- NULL 
} 
col_mat <- do.call(cbind,col_list) 
+0

第二种解决方案。 – Thomas 2013-05-06 12:26:39

+0

确实为第二个解决方案+1。我解决了这个问题,并且都更好地发现了你的问题。我的修复程序是:col1 <-subset(pearframe [order(pearframe [,1]),],select = 1,drop = F)' – 2013-05-06 12:34:13

+0

+1也适用于您的解决方案。漂亮而整洁。 – 2013-05-06 12:59:07

相关问题