【问题标题】:filter two data frames by the same group variables in dplyr通过 dplyr 中的相同组变量过滤两个数据帧
【发布时间】:2015-02-10 13:04:10
【问题描述】:

在许多情况下,在将数据框按一些变量分组后,我想应用一个函数,该函数使用另一个数据框的数据,该数据框按相同的变量分组。我发现的最佳解决方案是在函数中使用 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))

问题在于 semi_join 返回“Joining by...”消息,并且当我使用该函数进行引导时,我收到许多消息会导致控制台崩溃。那么,有什么方法可以减少连接的冗长吗?你知道一种更优雅的方式来做这样的事情吗?

附:几年前我问了一个类似的问题 plyrsubset inside a function by the variables specified in ddply

【问题讨论】:

  • 在您的示例中,d2 未按任何变量分组。
  • 我认为它是在函数内部使用 semi_join 函数隐式分组的
  • 如果您想摆脱这些消息,请明确说明您要加入的变量。
  • 现在,我正在使用 purrr 包中的 map2 解决此类问题。

标签: r dplyr tidyr


【解决方案1】:

如果您只想停止“Joining by:”语句,您只需使用 by 参数指定要加入的列。

例如:

semi_join(d2, d1, by="model")

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

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
}

【讨论】:

  • 我不想在函数中明确使用“模型”。我想我可以使用 group_var='model' 之类的东西,然后使用 d1 %>% group_by_(group_var) %>% do(myfun(., d2, group_var)) 之类的东西,最后在函数内部使用连接中的 group_bar但它看起来并不整洁。
  • @danilinares,您能否将您的问题更新为您希望最终函数的结构?您目前在当前解决方案中直接使用模型,所以我没有试图避免它。
  • 抱歉,我不太理解您关于更改问题的建议。我不喜欢在“myfun”中手动引入分组变量。在我建议数据帧 df2 由 do() 的分组变量过滤的尝试中,无需明确指出哪些是分组变量。
  • @danilinares,我上面的编辑是否充分解决了您的问题?
  • 我正在寻找更通用的东西,但是正如我在后续评论中所说的那样扩展您的第一个解决方案目前对我来说已经足够了(我将其发布为一个可行的解决方案)。跨度>
【解决方案2】:

我调整了@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))

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 2022-12-06
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多