gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:28:38 26 4
gpt4 key购买 nike

目前,我正在努力解决与使用 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

为了找到这个问题的解决方案,我在谷歌上搜索了它,发现了一个函数,排列,这就是我正在寻找的,但我发现很难将它压缩到 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]

对此有什么建议吗?我将非常感激。

最佳答案

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

关于r - 提取 data.table 中组内所有可能的对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40641612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com