2016-08-03 9 views
0

Ich habe drei data.table, wo jeder im quadratischen Raster gepaart werden muss. Ich möchte nur auf dem oberen/unteren Dreieck des Rasterquadrats laufen. Ich wette, das ist in anderen Programmiersprachen wie Java etwas geradeheraus, aber ich weiß nicht, wie ich es in R machen soll. Weiß irgendjemand irgendeinen Trick, dies einfach zu tun?Wie bekomme ich eine data.table des oberen oder unteren Dreiecks im Rasterquadrat?

Daten

mylist <- list(
    a <- data.table(
    start=seq(1, by=9, len=10), stop=seq(6, by=9, len=10), 
    ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE)), 
    b <- data.table(
    start=seq(2, by=11, len=10), stop=seq(8, by=11, len=10), 
    ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE)), 
    c <- data.table(
    start=seq(4, by=11, len=10), stop=seq(9, by=11, len=10), 
    ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE)) 
) 

alle möglichen Paare in quadratischen Raster (Ich habe manuell):

grid <- matrix((a,a), (a,b), (a,c), 
       (b,a), (b,b), (b,c), 
       (c,a), (c,b), (c,c),3,3) 

ich nicht die richtige Methode Rasterobjekt finden konnte, effizient zu erstellen, so dass ich die grob Pinbelegung Gitter von Hand.

gewünschter Ausgang:

Rasterobjekt könnte Matrix oder eine andere Darstellung sein. Dies ist ein Scratch-Code, in dem man sich vorstellt, dass get.ovlp die oben erwähnte Gitternetzdarstellung zurückgibt, aber überlappende Paare wiederholt wurden. Mein Ziel ist es, indem nur diese wiederholten Paare entfernen nur auf dem oberen zu Fuß/unten Dreieck squre grid

library(data.table) 
mylist <- list(a,b,c) 
get.ovlp <- function(set, idx=1L) { 
    que <- set[[idx]] 
    supp <- lapply(set[-idx], function(ele_) { 
    ans <- data.table::foverlaps(que, ele_) 
    }) 
    return(supp) 
} 

get.ovlp Funktion nur Spielzeug Beispiel ist, dass, wie wiederholt paarige Überlappung wie Rasterobjekt geschieht dargestellt.

Ich gehe nur auf Paar für obere/untere Dreieck (einschließlich Diagonale) von oben quadratischen Gitter, dann verwenden Sie foverlaps Funktion von data.table Paket. Kann jemand mögliche Ideen vorschlagen, um dieses Problem effizient zu lösen? Vielen Dank

+1

die Linie des 'grid' Objekt zu bauen, nicht gültig ist, und erzeugt einen Fehler. Was meinst du mit 'lass jede data.table als Paar '? Die gewünschte Ausgabe ist mir nicht klar – nicola

+0

@nicola: Ich konnte nicht die richtige Methode finden, um ordnungsgemäß Gitterobjekt effizient zu erstellen. Daher stelle ich einfach manuell dar, wie mein Gitterobjekt ist. – datageek

+1

'a',' b' und 'c' sind' data.tables'. Sie wollen eine 3x3-Matrix, in der jedes Element zwei 'data.tables' enthält? Warum willst du das? Sie sagen, dass Sie 'foverlaps' verwenden möchten. Kannst du erklären wie? Kannst du die gewünschte Ausgabe von nur einem Element deines Grids zeigen? – nicola

Antwort

1

Wenn ich Sie richtig verstehe, möchten Sie eine Funktion auf Elemente in mylist, z. ("a", "b"). Sie könnten zum Beispiel tun dies (I merge als Beispiel für die Funktion verwenden):

require(data.table) 

# your data (I named the elements a, b, and c) 
mylist <- list(a = data.table(start=seq(1, by=9, len=10), stop=seq(6, by=9, len=10), 
           ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE)), 
       b = data.table(start=seq(2, by=11, len=10), stop=seq(8, by=11, len=10), 
           ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE)), 
       c = data.table(start=seq(4, by=11, len=10), stop=seq(9, by=11, len=10), 
           ID=letters[seq(1:10)], score=sample(1:25, 10, replace = FALSE))) 


# build pairs on upper triangle 
# utilise fact that >= is meaningful for characters 
dt_idx = CJ(i = names(mylist), j = names(mylist))[j >= i] 

# apply function (here merge) by i, j: 
dt_idx[, 
     j = merge(x = mylist[[i]], y = mylist[[j]], by = c('start', 'stop', 'ID')), 
     by = list(i, j)] 

Hinweis: Bei der >= Operation auf den Listennamen nicht „sinnvoll“ mehr (weil die Namen nicht bestellt und/oder komplizierter) ist, können Sie immer einen integer Index verwenden, gilt dann die gleiche Logik ...

dt_idx = CJ(i = seq.int(length(mylist)), j = seq.int(length(mylist)))[j >= i] 
+0

Punkt ist Gitterobjekt, das ich oben erwähnt wiederhole gepaart, stellen wir uns vor, zum Beispiel, setdiff (a, b) sind die gleichen wie setdiff (b, a), die auf dem Raster platziert sind, so nur auf/unter Dreieck des Gitterquadrats, nicht wiederholtes gepaartes geschieht im neuen Gitter. – datageek

+1

ja, 'dt_idx' enthält nicht diese" Duplikate "(wenn Sie keine Reihenfolge berücksichtigen) – sbstn

+0

Ich frage mich, ob die gleiche Logik zu anderen Objekt wie data.frame erweitern, dann CJ-Funktion muss entsprechende Alternative, oder? – datageek