使用dplyr中的相同组变量过滤两个数据帧

使用dplyr中的相同组变量过滤两个数据帧,r,dplyr,tidyr,R,Dplyr,Tidyr,在很多情况下,在通过一些变量对数据帧进行分组之后,我希望应用一个函数,该函数使用来自另一个数据帧的数据,该数据帧由相同的变量进行分组。我发现的最佳解决方案是在函数内部使用semi_join,如下所示: d1 <- data.frame(model = c(1,1,2,2), x = runif(4) ) d2 <- data.frame(model=c(1,1,1,2,2,2), y = runif(6) ) myfun <- function(df1, df2) {

在很多情况下,在通过一些变量对数据帧进行分组之后,我希望应用一个函数,该函数使用来自另一个数据帧的数据,该数据帧由相同的变量进行分组。我发现的最佳解决方案是在函数内部使用semi_join,如下所示:

d1 <- data.frame(model = c(1,1,2,2), x = runif(4) )
d2 <- data.frame(model=c(1,1,1,2,2,2), y = runif(6) )

myfun <- function(df1, df2) {
   subsetdf2 <- semi_join(df2, df1)
   data.frame(z = sum(d1$x) - sum(subsetdf2$y)) # trivial manipulation just to exemplify
}

d1 %>% group_by(model) %>% do(myfun(., d2))

d1如果您只想停止'Joining by:'语句,则只需指定要使用
by
参数连接的列

例如:

semi_join(d2, d1, by="model")
编辑-作为使用
semi_join
的替代方法,您可以使用
base
解决方案。由于
groupby
函数按组传递数据,因此可以使用简单的索引语句进行筛选。这将避免需要额外的参数目前还假设感兴趣的列是第一列。

myfun <- function(df1, df2) {
  subsetdf2 <- df2[df2[,1] %in% unique(df1[,1]),]
  data.frame(z = sum(df1$x) - sum(subsetdf2$y)) # trivial manipulation just to exemplify
}

myfun我采用了@cdeterman的解决方案。不过这有点多余

d1 <- data.frame(model = c(1,1,2,2), x = runif(4) )
d2 <- data.frame(model=c(1,1,1,2,2,2), y = runif(6) )

myfun <- function(df1, df2, gv) {
  subsetdf2 <- semi_join(df2, df1, by = gv)
  data.frame(z = sum(d1$x) - sum(subsetdf2$y)) # trivial manipulation just to     exemplify
}

group_var <- 'model'
d1 %>% group_by_(group_var) %>% do(myfun(., d2,group_var))

d1在您的示例中,d2没有按任何变量分组。我认为它隐式地分组在函数中,带有semi_join函数。如果您想清除这些消息,请明确说明要加入哪些变量。现在,我正在使用包purrr中的map2解决此类问题。我不希望在函数中显式使用“model”。我想我可以使用像group\u var='model',然后像d1%>%group\u by_uu(group\u var)%>%do(myfun(,d2,group\u var))这样的东西,最后在函数内部使用连接中的group\u栏,但它看起来并不整洁。@danilinares,您能更新您的问题,以了解最终函数的结构吗?您当前在当前的解决方案中直接使用模型,因此我没有试图避免它。对不起,我不太理解您关于更改问题的建议。我不想在“myfun”中手动引入分组变量。在尝试中,我建议使用do()的分组变量过滤数据帧df2,而无需明确指出哪些是分组变量。@danilinares,我上面的编辑是否充分解决了您的问题?我正在寻找更一般的内容,但是,正如我在后续评论中所说的,扩展您的第一个解决方案目前对我来说已经足够好了(我将其作为一个可行的解决方案发布)。