在许多情况下,在通过某些变量对数据帧进行分组之后,我想应用一个函数,该函数使用来自另一个由相同变量分组的数据帧中的数据。我找到的最佳解决方案是在函数内使用 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 返回&#39;加入......&#39;消息,并且,当我使用函数来做引导程序时,我收到许多消息来折叠控制台。那么,有没有办法减少连接的冗长度?你知道更优雅的方式来做这样的事吗?
P.S。我几年前就 plyr 问了一个类似的问题:subset inside a function by the variables specified in ddply
答案 0 :(得分:2)
如果你想做的就是停止加入:&#39;声明,您只需要使用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
}
答案 1 :(得分: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))