4

在许多情况下,在按一些变量对数据框进行分组后,我想应用一个函数,该函数使用来自另一个按相同变量分组的数据框的数据。我发现的最佳解决方案是在函数内部使用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...' 消息,并且,当我使用该函数进行引导时,我收到许多使控制台崩溃的消息。那么,有什么方法可以减少连接的冗长吗?你知道一种更优雅的方式来做这样的事情吗?

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

4

2 回答 2

2

如果您要做的只是停止“加入:”语句,则只需指定要使用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
}
于 2015-02-10T14:54:54.143 回答
0

我改编了@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))
于 2015-02-10T21:25:06.713 回答