使用多个不同的 group_by 变量(dplyr)对数据框进行汇总

3

我是一个有用的助手,可以为您翻译文本。

我有一个数据框“my_data”,其中包含6列:

group1.members  group2.members  group3.members  price    price.2   price.3
 1                 1               1             800      877      334
 1                 2               1             850      877      334
 2                 2               1             859      877      334
 3                 1               1             859      877      334
 3                 1               2             870      877      334
 2                 2               2             870      877      334
 2                 3               2             870      877      334
 1                 3               3             880      877      334

我希望能够按照行(ROW)对“价格”(price)列进行分组,并将它们汇总到几个不同的数据框中,每个数据框使用不同的“组成员”(group.member)列进行分组。但是我发现,似乎无法使用 group_by 实现这个目标?
以下是我的设想:
my_data <- as.data.frame(data)
num_of_years <- c(1,2,3)
for(i in 1:length(num_of_years)){
   price_means <- my_data %>% group_by(my_data[i]) %>% 
   select(-value) %>%
   summarise_each(funs(mean(., na.rm=TRUE))) %>% 
   ungroup
   assign(paste("PriceMeans",i,sep=""),price_means, envir = .GlobalEnv)
}

换句话说:
对于i=1,使用group1.members进行分组。
对于i=2,使用group2.members进行分组。
对于i=3,使用group3.members进行分组。
编辑:我的解决方案如下:
for(i in 1:length(my_groups)){ 
  # construct the group to select
  current.group <- my_groups[i] 
  current.group <- paste0("memb_", current.group) 
  # construct the groups to exclude
  groups.to.drop <- my_groups[-i] 
  groups.to.drop <- paste0("memb_", groups.to.drop) 

  # Get Means 
  Means <- data %>% group_by_(as.name(current.group)) %>%  
    select(- c(ID, get(groups.to.drop))) %>% 
    summarise_each(funs(mean(., na.rm = TRUE))) 
  Means <- Means[,-1:-(length(my_groups)-1)] 
  Means <- as.list(Means) 
  assign(x = paste0("Means_",i), 
         value = Means,  
         envir = parent.env(new.env()) 
}

你需要使用lazyeval方法来编写函数。 - ArunK
谢谢!我查看了lazyeval的文档,但不知道如何实现它。你能提供一个简短的例子吗? - user5057431
这个特定的链接解释了dplyr库是如何处理lazyeval的链接 - ArunK
@Arun,看起来我们两个都有完全相同的用户名。这可能会让人感到困惑。你会考虑更改你的用户名吗?我之所以问是因为我已经在R标签下使用这个用户名很长时间了(=许多人已经将这个用户名与我联系在一起)。 - Arun
1个回答

1
我绝不是 dplyr 专家,但这似乎可以实现您想要做的事情:
for (i in 1:length(num_of_years)){
  var1 <- names(my_data)[[i]]
  var2 <- c(var1)

  price_means <- my_data %>% 
    select(eval(i), price, price.2, price.3) %>% 
    group_by_(var2) %>% 
    summarise_each(funs(mean(., na.rm=TRUE))) %>% 
    ungroup()

  assign(paste("PriceMeans",i,sep=""),price_means, envir = .GlobalEnv)
}

谢谢,这个对我很有帮助。最后我使用了类似的方法(请参考我上面编辑的问题)。 - user5057431

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接