【问题标题】:Using multiple different group_by variables (dplyr) to summarise a dataframe使用多个不同的 group_by 变量 (dplyr) 来汇总数据帧
【发布时间】:2016-09-17 19:40:17
【问题描述】:

我有一个包含 6 列的数据框“my_data”:

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 将 my_data 的“价格”列总结为几个单独的数据框,并在每个不同的“group.member”列上使用 group_by。不过,似乎 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,使用 group_by(group1.members)
  • 对于 i=2,使用 group_by(group2.members)
  • 对于 i=3,使用 group_by(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方法来编写你的函数。
  • 谢谢!我查看了lazyeval 的文档,但不明白如何实现这一点。你能提供一个简短的例子吗?
  • 这个特定的链接解释了lazyeval是如何由dplyr库处理的link
  • @Arun,好像我们都有 exact 相同的句柄。这可能会令人困惑。你会考虑改变你的吗?我之所以问,是因为我在 R 标记下的这个句柄下活动的时间更长(= 许多人已经把这个句柄与我联系起来了)。

标签: r dplyr


【解决方案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)
}

【讨论】:

  • 谢谢,这很有帮助。最后我使用了非常相似的东西(见我上面的问题编辑)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2018-11-03
  • 2017-06-09
相关资源
最近更新 更多