我想在对数据进行分组后使用 dplyr 中的 summarise() 来计算新变量。但是,我希望它对某些数据使用一个方程,对其余数据使用第二个方程。

我曾尝试将 group_by()summarise()if_else() 一起使用,但它不起作用。

这是一个例子。假设——出于某种原因——我想为萼片长度找到一个特殊的值。对于物种“setosa”,这个特殊值是萼片长度平均值的两倍。对于所有其他物种,它只是萼片长度的平均值。这是我试过的代码,但它不适用于 summarise()

library(dplyr)
iris %>%
   group_by(Species) %>%
   summarise(sepal_special = if_else(Species == "setosa", mean(Sepal.Length)*2, mean(Sepal.Length)))

这个想法适用于 mutate(),但我需要将 tibble 重新格式化为我正在寻找的数据集。
library(dplyr)
iris %>%
   group_by(Species) %>%
   mutate(sepal_special = if_else(Species == "setosa", mean(Sepal.Length)*2, mean(Sepal.Length)))

这就是我希望生成的 tibble 的布局方式:
library(dplyr)
iris %>%
group_by(Species)%>%
summarise(sepal_mean = mean(Sepal.Length))

  # A tibble: 3 x 2
  # Species    sepal_special
  # <fctr>          <dbl>
  #1 setosa           5.01
  #2 versicolor       5.94
  #3 virginica        6.59
  #>

但我的结果会显示 setosa x 2 的值
# A tibble: 3 x 2
      # Species    sepal_special
      # <fctr>          <dbl>
      #1 setosa          **10.02**
      #2 versicolor       5.94
      #3 virginica        6.59
      #>

建议?我觉得我真的在寻找将 if_else()summarise() 一起使用的方法,但在任何地方都找不到,这意味着必须有更好的方法。

谢谢!

最佳答案

mutate 步骤之后,使用 summarise 获取每个 'Species' 的 'sepal_special' 的 first 元素

iris %>%
  group_by(Species) %>%
  mutate(sepal_special = if_else(Species == "setosa",
               mean(Sepal.Length)*2, mean(Sepal.Length))) %>%
 summarise(sepal_special = first(sepal_special))
# A tibble: 3 x 2
#  Species    sepal_special
#   <fctr>             <dbl>
#1 setosa             10.0
#2 versicolor          5.94
#3 virginica           6.59

或者不调用 mutate ,在应用 if_else 后,获取 summarise 中的第一个值
iris %>%
   group_by(Species) %>%
   summarise(sepal_special = if_else(Species == "setosa",
           mean(Sepal.Length)*2, mean(Sepal.Length))[1])
# A tibble: 3 x 2
#  Species    sepal_special
#  <fctr>             <dbl>
#1 setosa             10.0
#2 versicolor          5.94
#3 virginica           6.59

关于r - 如何将条件汇总为 R 中的单个变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49503539/

10-16 08:42