如何使用dplyr改善数据框中的性能选择行?

时间:2014-07-09 06:45:16

标签: r dplyr

我想从df2中选择包含另一个data.frame中几列相同值的行。

首先,我会生成一些数据来显示我的问题。

set.seed(1)

df1 <- expand.grid(list(A = 1:30, B = 1:30, D = 1:30))
df1$value <- runif(nrow(df1))

df2 <- expand.grid(list(A = 1:30, B = 1:30, C = 1:30, D = 1:30))
df2$value <- runif(nrow(df2))

然后我计算df1中A列的最大值。

library(dplyr)

df1_opt <- tbl_df(df1) %>%
    group_by(A) %>%
    filter(value == max(value)) %>%
    arrange(A)

现在我需要选择df2中的行,它们在df1中具有相同的列A,B,D值。

selectRow <- function(.data)
{
    pos <- df1_opt$A %in% .data$A[1]
    pos2 <- .data$B == df1_opt$B[pos] & 
        .data$D == df1_opt$D[pos]
    return(.data[pos2,])

}

system.time(df2_opt <- tbl_df(df2) %>%
    group_by(A, B, C) %>%
    do(selectRow(.)))

我的代码在虚拟服务器中大约需要40秒。我怎样才能提高代码的性能?感谢您的任何建议。

2 个答案:

答案 0 :(得分:2)

一种可能性:

df2$E <- do.call(paste, c(df2[c("A", "B", "D")], sep="_"))
df1_opt$E <- do.call(paste, c(df1_opt[c("A", "B", "D")], sep="_"))
df2_opt <- df2%.%group_by(A,B,C)%.%filter(E%in%df1_opt$E)

HTH

答案 1 :(得分:2)

我很确定这只是一个半连接:

library(dplyr)
tbl_df(df2) %>% 
  semi_join(df1_opt, by = c("A", "B", "D"))