如何在 plyr 中进行迭代连接

How to do iterative joins in plyr

考虑以下代码:

df_a <- df_b <- df_c <- df_d <- expand.grid(AA=1:20, BB=1:20) 
n <- dim(df_a)[1]
df_a$A <- runif(n)
df_b$B <- runif(n)
df_c$C <- runif(n)
df_d$D <- runif(n)

df_a <- df_a[sample(1:n, replace=TRUE),]  
df_b <- df_b[sample(1:n, replace=TRUE),]  
df_c <- df_c[sample(1:n, replace=TRUE),]  
df_d <- df_d[sample(1:n, replace=TRUE),]  

require(plyr)

df_combined <- join(x=df_a, y=df_b)
df_combined <- join(x=df_combined, y=df_c)
df_combined <- join(x=df_combined, y=df_d)

使用拆分-应用-组合模式创建 df_combined 的好方法是什么?当然,一旦从第一个连接创建了 df_combined,我就可以使用 for 循环将后面的对象传递给它。但这要求对象 df_combined 首先存在于循环之外,这意味着代码不能轻易地向量化。

有没有一种方法,例如,对于 plyr 将一个对象分成的每一部分,在一个函数中引用前面或后面的部分?

重复将数据连接在一起的一种方法是使用 Reduce。它不属于与 plyr 相同的包系列,但它是一种将二元函数重复应用于元素列表的更通用的方法。在你的情况下,你可以这样做:

df_combined <- Reduce(join, list(df_a, df_b, df_c, df_d))

但是请注意,这不会比 运行 快多少(对于计算机)。事实上,Reduce 的核心只是一个 for 循环。但我发现语法很干净。