r - dplyr 仅返回分组和计算列

标签 r dplyr

我想知道是否有办法做到这一点:

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

同时跳过选择位。我认为以下应该有效(但由于多种原因无效):

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

最佳答案

现在可以使用 dplyr 的新 transmute 函数来简化此操作,该函数会删除除分组变量和计算变量(本例中为 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

关于r - dplyr 仅返回分组和计算列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22971446/

相关文章:

r - 向数据框的所有列添加千位分隔符

Rowwise,如何指定某个值来自哪一列?

r - 如果并非所有列都存在于所有文件中,如何计算列的平均值?

r - 10 行 block 中 p 值的循环改组

r - 50 个州随时间变化的箱线图

r - loadNamespace 错误,使用包 plm 找不到对象 'vI'

r - 我可以使用 dplyr 从所有列名中删除空格吗?

r - 如何从 R 的部分依赖图中选择一个图?

r - 使用 rename_all 从列名中删除数字

r - 根据特定列 R 中的值将列值乘以另一个值