在data.table中提取组内所有可能的对

时间:2016-11-16 20:23:12

标签: r data.table lapply

目前,我正在努力解决与使用data.table获取组内所有可能排列相关的问题。

为了解释我的问题,让我给你举个例子。

x   y1      y2
1   black   blue
1   black   red
1   blue    black
1   blue    red
1   red     black
1   red     blue
2   orange  red
2   red     orange

现在我想在组(x)中看到每一对可能的颜色(y)。所以我理想的结果就是......

y <- c('red', 'blue', 'black')
permutations(n=3, r=2, v=y, repeats.allowed=F)

     [,1]    [,2]   
[1,] "black" "blue" 
[2,] "black" "red"  
[3,] "blue"  "black"
[4,] "blue"  "red"  
[5,] "red"   "black"
[6,] "red"   "blue" 

为了找到解决方案,我搜索了它,我发现了一个函数,排列,这就是我正在寻找的东西,但我发现很难将它压缩到data.table框架中。

dt1[, .(j = lapply(.SD, permutations, n=.N, r=2, v=y, repeats.allowed=F)), by=x]

所以我试着做了以下但显然它有错误..

phpunit.xml

对此有何建议? 我真的很感激。

1 个答案:

答案 0 :(得分:4)

首先,不要使用as.data.table(cbind(...))来创建数据表。由于cbind强制转换为矩阵,您将获得意外的列类。使用

dt1 <- data.table(x, y)

那就是说,你可以做到

dt1[, {
        p <- gtools::permutations(.N, 2, y, repeats=FALSE)
        .(y1 = p[, 1], y2 = p[, 2])
    }, by = x]

给出了

   x     y1     y2
1: 1  black   blue
2: 1  black    red
3: 1   blue  black
4: 1   blue    red
5: 1    red  black
6: 1    red   blue
7: 2 orange    red
8: 2    red orange

由于我们在群组上进行操作,因此无需循环。 permutations会创建一个矩阵,因此我们会根据permutations生成的矩阵列创建所需的结果列。