2015-11-17 20 views
6

varsayalım Birkaç vektörleri var - belki bir liste halinde depolanmaktadır, ama orada ince çok var daha iyi bir veri yapısı ise:r eşitsiz boyutlu vektörlerin bir listesini sıralama

ll <- list(c(1,3,2), 
      c(1,2), 
      c(2,1), 
      c(1,3,1)) 

Ve istiyorum bağları çözmek için daha sonra ilk numara, ikinci numarasını kullanarak, onları sıralamak, sonra üçüncü sayı

c(1,2) 
c(1,3,1) 
c(1,3,2) 
c(2,1) 

var mıdır kalan bağları, vb .: çözmek için bana bunu ya bunu sağlayacak yerleşik işlev herhangi Kendi çözümümümü mi kullanmalıyım?

Ben eksik değerler ve rbind.data.frame yerine paste kullanmak için NA kullanmayı tercih ediyorum

+2

. org/wiki/Lexicographical_order) adlı üyenin tam profilini görüntüleyin. – Falko

+0

Sadece not etmek gerekirse (bunu bu soruda belirtmeliydim): her bir vektörün öğeleri tek bir rakamdan daha fazla olabilir. bir vektör c (1,10,1) – RobinL

+0

olabilir. Sıralamalarınızın anlamlı olması için, tüm vektörlerin aynı uzunlukta olması gerekir (yani, "NA" değerleri ile doldurulmalıdır). Bu durumda bir "matris" veya "data.frame" mantıklı bir veri yapısı olacaktır. Cevabım, vektörlerinizi değiştirmek istemediğinizi varsayar. – Roland

cevap

6
ll <- list(c(1,3,2), 
      c(1,2), 
      c(2,1), 
      c(1,3,1)) 

(Python, bilenler için ne peşindeyim Python sıralama davranışını taklit şeydir):

sortfun <- function(l) { 
    l1 <- lapply(l, function(x, n) { 
    length(x) <- n 
    x 
    }, n = max(lengths(l))) 
    l1 <- do.call(rbind.data.frame, l1) 
    l[do.call(order, l1)] #order's default is na.last = TRUE 
} 

sortfun(ll) 

#[[1]] 
#[1] 1 2 
# 
#[[2]] 
#[1] 1 3 1 
# 
#[[3]] 
#[1] 1 3 2 
# 
#[[4]] 
#[1] 2 1 
+1

Güzel. Sanırım bu çizgide bir iyileşme olabilir [siparişler, gecikmeli (seq_len (maks (uzunluklar) (ll)), işlev (x) vapply (ll, "[", FUN.VALUE = 1, x).)))] ', süreç içinde bir' data.frame' oluşturmaya gerek yoktur. – nicola

+0

Teşekkürler. Bu konuyu izlerken kendi çözümümü yaratmaya çalışıyordum. Seninkine benziyordu, ama ben gerçekten senin gerçekleştirdiğinin farkında olmadığım (x) <- n 'hünerlerini beğendim. Ayrıca rbind.data.frame' yapabildiğini de bilmiyordum (bunu iki adımda yaptım). – RobinL

1

data.table'u kullanan bir yaklaşım.

Sonuç, tarif ettiğiniz biçimde sipariş edilen sıralarla dikdörtgen data.table şeklindedir. NA değerleri, liste öğesinin farklı bir uzunluk olduğu yerde doldurulur.

library(data.table) 
setorderv(data.table(do.call(cbind, transpose(l))), paste0("V", 1:max(lengths(l))))[] 
# V1 V2 V3 
# 1: 1 2 NA 
# 2: 1 3 1 
# 3: 1 3 2 
# 4: 2 1 NA 

Bu çirkin, ama eğer böyle bir şey ile listenizdeki sonucu kullanabilirsiniz: //en.wikipedia: [ "kıyaslanmasında düzen"] (https var

l[setorderv(
    data.table(
    do.call(cbind, transpose(l)))[ 
     , ind := seq_along(l)][], 
    paste0("V", seq_len(max(lengths(l)))))$ind] 
İlgili konular