2016-08-03 69 views
0

我有三个data.table,每个需要在方格中互相配对。我只想在网格广场的上下三角形上行走。我敢打赌,这在Java等其他编程语言中很简单,但我不知道如何在R中做到这一点。有谁知道这样做很简单吗?如何获得网格正方形中上下三角形的配对data.table?

数据
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)) 
) 

所有可能的对在正方形栅格(I手动一样):

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

我无法找到合适的方法有效地创建网格对象,所以大致销从网格通过手动。

期望的输出:

网格对象可能是矩阵或其他表示形式。这是从头开始的代码,假设get.ovlp返回上面提到的网格表示,但重复的对重复了。我的目标是,通过除去这些重复对仅仅走在上/下方squre网格的三角

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函数仅是玩具的例子,如何重复配对重叠发生等为代表的网格对象。

我只能从上面的方形网格上面/下面的三角形(包括对角线)对上走,然后使用data.table包中的foverlaps函数。任何人都可以提出可能的想法来有效解决这个问题吗非常感谢

+1

线打造'grid'对象是无效的,并产生一个错误。 “让每个data.table成对”是什么意思?期望的输出不清楚 – nicola

+0

@nicola:我无法找到合适的方法来有效地构建适当的网格对象。因此,我只是手动表示我的网格对象。 – datageek

+1

'a','b'和'c'是'data.table's。你想要一个3x3矩阵,其中每个元素包含两个'data.table's?为什么你想要这个?你说你想用'foverlaps'。你能解释一下吗?你可以只显示你的'grid'元素的所需输出吗? – nicola

回答

1

如果我的理解正确,您希望将函数应用于mylist中的元素对,例如, ("a", "b")。例如,你可以做到这一点(我用merge作为函数为例):

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)] 

注: 如果在列表名称>=操作不是“有意义”了(因为名字未排序和/或更复杂的),你可以随时使用integer指数,然后采用相同的逻辑......

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

点是我上面提到的网格对象包含重复配对,让我们想象一下,例如,setdiff(a,b)与setdiff(b,a)相同,它们放置在网格的正方形上,所以只能在上/下网格三角形,非重复配对发生在新网格中。 – datageek

+1

是的,'dt_idx'不包括那些“重复”(当你不考虑顺序) – sbstn

+0

我想知道是否将相同的逻辑扩展到其他对象,如data.frame,然后CJ功能必须有相应的替代,对吗? – datageek

相关问题