如何将条件汇总到R中的单个变量?

时间:2018-03-27 02:37:23

标签: r dplyr

我想在分组数据后使用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)))

这就是我想要产生的结果:

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()一起使用的方法,但无法在任何地方找到它,这意味着必须有更好的方法。

谢谢!

2 个答案:

答案 0 :(得分:2)

mutate步骤之后,使用summarise为每个'物种'获取'first元素'sepal_special'

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

答案 1 :(得分:1)

另一个选择:因为平均值的两倍与值的两倍的平均值相同,你可以将setosa的萼片长度加倍,然后总结:

iris %>% 
  mutate(Sepal.Length = ifelse(Species == "setosa", 2*Sepal.Length, Sepal.Length)) %>% 
  group_by(Species) %>% 
  summarise(sepal_special = mean(Sepal.Length))

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