【发布时间】:2014-04-09 18:48:58
【问题描述】:
我想知道是否有办法做到这一点:
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
【问题讨论】:
-
@Arun,没错,虽然我真的认为
select应该这样做。我看不出这样做的缺点(尽管我没有想太多)。另一种解决方案是允许summarise处理表达式返回值中的多行。 -
@Arun,公平点,但我不想将我对
select应该做什么的看法强加给dplyr;如果有其他方法可以做到这一点,我也会很高兴。 -
目前没有什么好办法。请参阅github.com/hadley/dplyr/issues/302 进行一些讨论。我不认为
select()可以这样工作,因为它是当前的非标准评估规则。