我想从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秒。我怎样才能提高代码的性能?感谢您的任何建议。
答案 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"))