您可以使用CJ
"自交"连接每个列:
dtIn[, lapply(.SD, function(x) Reduce(if (class(x)=="character") paste0 else `+`, CJ(x,x)))]
这有一些优点outer
:
它不涉及将矩阵(从outer
)强制回到矢量.
它不需要重复输入var名称.
如果dtIn
列具有名称(默认值除外),则会保留它们.
它可以相当干净地扩展(例如,CJ(x,x,x)
获得3x组合).
.
在基础中,这可以完成expand.grid
,这基本上与CJ
:
DF = data.frame(dtIn) data.frame(lapply(DF, function(x) Reduce(if (class(x)=="character") paste0 else `+`, expand.grid(x,x))))
双循环建议使用outer
此处:
dtIn[,list(outer(V1,V1,paste0),outer(V2,V2,"+"))] # V1 V2 # 1: AA 1.2 # 2: BA 0.9 # 3: CA 0.7 # 4: AB 0.9 # 5: BB 0.6 # 6: CB 0.4 # 7: AC 0.7 # 8: BC 0.4 # 9: CC 0.2