dplyr仅返回分组和计算列

时间:2014-04-09 18:48:59

标签: r dplyr

我想知道是否有办法这样做:

iris %.% group_by(Species) %.% 
  mutate(v1=Sepal.Length / mean(Sepal.Length)) %.% 
  filter(v1 > 1.15) %.% select(Species:v1)

跳过select位。我认为以下内容应该有效(但由于许多原因,并没有):

iris %.% group_by(Species) %.% 
  select(Species, v1=Sepal.Length / mean(Sepal.Length)) %.% 
  filter(v1 > 1.15)

请注意,在此示例中,我将mutate替换为select,希望单独这样做。这也不起作用,因为summarize期望表达式返回1值:

iris %.% 
  group_by(Species) %.% 
  summarise(Sepal.Length / mean(Sepal.Length)) %.% 
  filter(v1 > 1.15)

显然,这不是一个大问题,但想知道是否有一种更简单的方法来复制默认的data.table行为:

data.table(iris)[, Sepal.Length / mean(Sepal.Length), by=Species][V1 > 1.15]

仅生成by列和计算值:

      Species       V1
1:     setosa 1.158610
2: versicolor 1.179245
3: versicolor 1.162399
4:  virginica 1.153613
5:  virginica 1.168792
6:  virginica 1.168792
7:  virginica 1.168792
8:  virginica 1.199150
9:  virginica 1.168792

1 个答案:

答案 0 :(得分:2)

现在可以使用dplyr的新transmute函数简化此操作,该函数会删除除分组变量和cumputed变量之外的任何列(在这种情况下为V1)。

require(dplyr) # >= 0.3.0.2
iris %>% 
  group_by(Species) %>% 
  transmute(v1 = Sepal.Length / mean(Sepal.Length)) %>% 
  filter(v1 > 1.15)

#Source: local data frame [9 x 2]
#Groups: Species
#
#     Species       v1
#1     setosa 1.158610
#2 versicolor 1.179245
#3 versicolor 1.162399
#4  virginica 1.153613
#5  virginica 1.168792
#6  virginica 1.168792
#7  virginica 1.168792
#8  virginica 1.199150
#9  virginica 1.168792