2013-09-22 68 views
0

內排序我有R中的數據幀,其具有包含四個號碼列表類型的列:R:安排和嵌套列表

  Size 
Ford 1,2,3,4 
Gm  2,3,5,6 
Nissan 2,3,4,5 
Toyota 1,2,2,4 

這裏車名(福特等)是行的名稱和大小( 「1,2,3,4」等)是一列列表。

我想在列大小的3號這個數據幀進行排序,以便我們得到以下結果:

  Size 
Toyota 1,2,2,4 
Ford 1,2,3,4 
Nissan 2,3,4,5 
Gm  2,3,5,6 

在一個完整的例子,我有每一行中的列,但我還是希望做按大小列中的第三個值進行排序。

+2

當詢問有關非標準的結構,可能值得使用'dput'來創建一個可重現的例子。例如'data.frame(大小= I(列表(1:4,C(2,3,5,6-),2:5,C(1,2,2,4-))),row.names = C(」福特「,」Gm「,」Nissan「,」Toyota「))' – thelatemail

+0

抱歉,這不是很好,但能夠輕鬆創建可重複的示例,但您的解決方案完美無缺,謝謝! – Sergey

回答

4

類似下面將工作 - 我會先翻拍數據:

dat <- data.frame(
    ID=1:4, 
    Size=I(list(1:4,c(2,3,5,6),2:5,c(1,2,2,4))), 
    row.names=c("Ford","Gm","Nissan","Toyota") 
) 

它看起來像:

 ID  Size 
Ford 1 1, 2, 3, 4 
Gm  2 2, 3, 5, 6 
Nissan 3 2, 3, 4, 5 
Toyota 4 1, 2, 2, 4 

然後命令它:

dat[order(sapply(dat$Size,"[",3)),] 

     ID  Size 
Toyota 4 1, 2, 2, 4 
Ford 1 1, 2, 3, 4 
Nissan 3 2, 3, 4, 5 
Gm  2 2, 3, 5, 6 
+0

我有相同的'order' /'sapply'解決方案,但沒有ID列,當您嘗試訂購時,數據框似乎轉換爲列表。有關這種情況發生的任何見解? – Marius

+1

@Marius - 你可以用'dat [命令(sapply(dat $ Size,「[」,3)),, drop = FALSE]來阻止這種情況發生 - 請參閱幫助文件在'?「[」' - 「*如果(drop ==)'TRUE',結果被強制爲儘可能低的維數(參見示例)*「 – thelatemail

+0

該解決方案適用於我,即使沒有ID也可以保留data.frame,也許是因爲我原本有多個柱。謝謝! – Sergey