我正在寻找尽可能快的速度,并留在基地做什么expand.grid.我过去曾outer用于类似的目的来创建一个向量; 这样的事情:
v <- outer(letters, LETTERS, paste0)
unlist(v[lower.tri(v)])
Run Code Online (Sandbox Code Playgroud)
基准测试表明我outer可以快得多,expand.grid但这次我想创建两个列,就像expand.grid(2个向量的所有可能的组合)一样,但是我的方法outer与外部这个时候没有基准.
我希望采用2个向量并尽可能快地创建每个可能的组合作为两列(我认为outer可能是路线,但对任何基本方法都是敞开的.
这是expand.grid方法和outer方法.
dat <- cbind(mtcars, mtcars, mtcars)
expand.grid(seq_len(nrow(dat)), seq_len(ncol(dat)))
FOO <- function(x, y) paste(x, y, sep=":")
x <- outer(seq_len(nrow(dat)), seq_len(ncol(dat)), FOO)
apply(do.call("rbind", strsplit(x, ":")), 2, as.integer)
Run Code Online (Sandbox Code Playgroud)
微基准测试显示outer较慢:
# expr min lq median uq max
# EXPAND.G 812.743 838.6375 894.6245 927.7505 27029.54
# OUTER 5107.871 5198.3835 5329.4860 5605.2215 27559.08
Run Code Online (Sandbox Code Playgroud)
我认为我的outer使用很慢,因为我不知道如何使用 …
在这个主题中,我试图在这里包括所有常见问题及其答案.我希望这对某人有用.
一般问题:如何r从n对象生成对象序列?
总共存在这类2^3=8问题.
[更新]
Josh O'Brien认为这8个问题与十二种方式有关.实际上,"不同"的问题以十二种方式包含在内,而"非独特"的问题则不包括在内.无论如何,将这里的8个问题与12倍的方式进行比较是很有趣的.请参阅注释以获取进一步的读数.