【问题标题】:dplyr return only grouping and computed columnsdplyr 仅返回分组和计算列
【发布时间】: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() 可以这样工作,因为它是当前的非标准评估规则。

标签: r dplyr


【解决方案1】:

现在可以使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多