繁体   English   中英

在dplyr中通过相同的组变量过滤两个数据帧

[英]filter two data frames by the same group variables in dplyr

在许多情况下,在通过某些变量对数据帧进行分组之后,我想应用一个函数,该函数使用来自另一个由相同变量分组的数据帧中的数据。 我找到的最佳解决方案是在函数内部使用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几年前我问了一个类似的问题: plyr函数中的子集是由ddply中指定的变量

如果您要做的只是停止'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
}

我改编了@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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM