【问题标题】:Extract all possible pairs within group in data.table提取 data.table 中组内的所有可能对
【发布时间】:2016-11-16 20:23:11
【问题描述】:

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

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

x <- c(1, 1, 1, 2, 2)
y <- c('red', 'blue', 'black', 'orange', 'red')
dt1 <- as.data.table(cbind(x,y))
dt1
   x      y
1: 1    red
2: 1   blue
3: 1  black
4: 2 orange
5: 2    red

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

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

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

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" 

所以我尝试执行以下操作,但显然它有错误..

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

对此有什么建议吗? 我会很感激的。

【问题讨论】:

  • 或许dt1[ , CJ(y, y), by = x][V1 != V2]

标签: r data.table lapply


【解决方案1】:

首先,不要使用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 的结果矩阵列创建我们想要的结果列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 2017-01-23
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多