R中数据帧行的组合
我想创建一个新的数据帧,这样 df1 结果R中数据帧行的组合,r,data.table,combinations,R,Data.table,Combinations,我想创建一个新的数据帧,这样 df1 结果 A1 B1 C1 A2 B2 C2 1 2 3 4 5 6 1 2 3 7 8 9 4 5 6 7 8 9 基本上,行的成对组合使得行[i]!=第[j]行 我可以用for循环来做这个。但我想知道是否有一种方法可以使用data.table或apply函数来加快速度。如果数据框中总是数字,那么可以使用以下方法 ## Generate data DF <- as.data.frame(matrix(1:9,3)) DF
A1 B1 C1 A2 B2 C2
1 2 3 4 5 6
1 2 3 7 8 9
4 5 6 7 8 9
基本上,行的成对组合使得行[i]!=第[j]行
我可以用for循环来做这个。但我想知道是否有一种方法可以使用data.table或apply函数来加快速度。如果数据框中总是数字,那么可以使用以下方法
## Generate data
DF <- as.data.frame(matrix(1:9,3))
DF
V1 V2 V3
1 1 4 7
2 2 5 8
3 3 6 9
这就产生了这个矩阵
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 2 3 4 5 6
[2,] 1 2 3 7 8 9
[3,] 4 5 6 7 8 9
如果在数据框中需要非数字列,则需要稍微调整上面的代码
根据以下评论进行更新
为了使输入与OP相同,我们只需要确保在函数调用中提取行而不是列
DF <- as.data.frame(matrix(1:9,3,byrow=TRUE))
t(apply(t(combn(3,2)), 1, FUN = function(x){unlist(DF[x,])}))
顺序不同,但结果相同。如果数据帧中总是数字,则可以使用以下命令
## Generate data
DF <- as.data.frame(matrix(1:9,3))
DF
V1 V2 V3
1 1 4 7
2 2 5 8
3 3 6 9
这就产生了这个矩阵
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 2 3 4 5 6
[2,] 1 2 3 7 8 9
[3,] 4 5 6 7 8 9
如果在数据框中需要非数字列,则需要稍微调整上面的代码
根据以下评论进行更新
为了使输入与OP相同,我们只需要确保在函数调用中提取行而不是列
DF <- as.data.frame(matrix(1:9,3,byrow=TRUE))
t(apply(t(combn(3,2)), 1, FUN = function(x){unlist(DF[x,])}))
顺序不同,但结果相同。一种不会强制不同列都是相同类型的解决方案:
DF <- as.data.frame(matrix(1:9,3,byrow=TRUE))
cmb <- combn(seq_len(nrow(DF)), 2)
cbind(DF[cmb[1,],], DF[cmb[2,],])
# V1 V2 V3 V1 V2 V3
#1 1 2 3 4 5 6
#1.1 1 2 3 7 8 9
#2 4 5 6 7 8 9
DF一种不会强制不同列都是相同类型的解决方案:
DF <- as.data.frame(matrix(1:9,3,byrow=TRUE))
cmb <- combn(seq_len(nrow(DF)), 2)
cbind(DF[cmb[1,],], DF[cmb[2,],])
# V1 V2 V3 V1 V2 V3
#1 1 2 3 4 5 6
#1.1 1 2 3 7 8 9
#2 4 5 6 7 8 9
DF不知道为什么这会吸引这么多的反对票。要做到这一点其实相当棘手。不知道为什么会吸引这么多的反对票。事实上,要做到这一点相当棘手。您的示例数据与OP的不一样。试试DF Lol-直到现在才注意到你的评论。迟做总比不做好你的示例数据与OP的不一样。试试DF Lol-直到现在才注意到你的评论。迟到总比不做好