如何在 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
循环。但我发现语法很干净。
考虑以下代码:
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
循环。但我发现语法很干净。