【问题标题】:dplyr-summarise, keep the original group namedplyr-summarise,保留原组名
【发布时间】:2020-10-20 01:06:53
【问题描述】:
iris %>% mutate(subgroup=rep(c('A','B'),75)) %>% group_by(Species) %>% summarise(SLmin=min(Sepal.Length))



  Species    SLmin
  <fct>      <dbl>
1 setosa       4.3
2 versicolor   4.9
3 virginica    4.9

我想保留原来的子组名称。 但是

iris %>% mutate(subgroup=rep(c('A','B'),75)) %>% group_by(Species,subgroup) %>% summarise(SLmin=min(Sepal.Length))

  Species    subgroup SLmin
  <fct>      <chr>    <dbl>
1 setosa     A          4.4
2 setosa     B          4.3
3 versicolor A          5  
4 versicolor B          4.9
5 virginica  A          4.9
6 virginica  B          5.6

此代码不能在每个物种中获得最小值。

你知道吗?

PS:

这很难解释,所以我会解决它。

我需要子组。
总结结果后。

setosa     B          4.3  
versicolor B          4.9
virginica  A          4.9

【问题讨论】:

  • 每个Species 有多个subgroups,哪个是原始子组?
  • 您使用的是哪个版本的 dplyr?例如,在 dplyr 1.0.2 中,在summarise() 函数中,您应该使用参数.groups。但是,要将变量 subgroup 保留为分组变量,您可以将分组级别重新组织为 group_by(subgroup, Species) %&gt;% summarise(..., .groups = "drop_last")
  • dplyr 是‘1.0.2’

标签: r dplyr


【解决方案1】:

您可以使用which.min 获取Sepal.Length 最小值的索引,该索引可用于子集对应的subgroup 值。

library(dplyr)

iris %>% 
  mutate(subgroup=rep(c('A','B'),75)) %>% 
  group_by(Species) %>% 
  summarise(SLmin=min(Sepal.Length), 
            subgroup = subgroup[which.min(Sepal.Length)])

#  Species    SLmin subgroup
#  <fct>      <dbl> <chr>   
#1 setosa       4.3 B       
#2 versicolor   4.9 B       
#3 virginica    4.9 A       

另一种方法是为每个Species 选择最小行,然后在最终输出中只选择我们需要的那些列。

iris %>% 
  mutate(subgroup=rep(c('A','B'),75)) %>% 
  group_by(Species) %>% 
  slice(which.min(Sepal.Length))

【讨论】:

    猜你喜欢
    • 2020-04-25
    • 2018-11-14
    • 2019-11-27
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2018-04-30
    • 2020-11-09
    • 2014-10-05
    相关资源
    最近更新 更多