目前,我正在努力解决与使用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
对此有何建议? 我真的很感激。
答案 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
生成的矩阵列创建所需的结果列。