【问题标题】:How to keep other columns when using dplyr?使用 dplyr 时如何保留其他列?
【发布时间】:2020-07-10 18:48:54
【问题描述】:

我遇到了与How to aggregate some columns while keeping other columns in R? 描述的类似问题,但我尝试过的解决方案都没有。

我有一个这样的数据框:

df<-data.frame(a=rep(c("a","b"),each=2),b=c(500,400,200,300), 
               c = c(5,10,2,4),stringsAsFactors = FALSE) 
> df
  a   b  c
1 a 500  5
2 a 400 10
3 b 200  2
4 b 300  4

df%>%
  group_by(a)%>%
  summarise('max' = max(c), 'sum'=sum(c))

  a       max   sum
  <chr> <dbl> <dbl>
1 a        10    15  
2 b         4     6

but I need also column b:

1 a        10    15   400
2 b         4     6   300

b 列的值为 max(c)。


编辑特定案例的数据:

> df
  a   b  c
1 a 500  5
2 a 400  5

在这种情况下,我需要在摘要中设置更高的值 col b

#   a       max   sum     b
#   <chr> <dbl> <dbl> <dbl>
# 1 a         5    10   500

【问题讨论】:

  • 列 b 有 4 个值,在您的输出中显示 2 个值。你如何决定在输出中使用哪些?
  • 我在末尾添加了关于计数列 b 的信息
  • 为什么不明确添加它们summarise('max' = max(c), 'sum'=sum(c), 'b'=max(b))
  • 这不是很好的解决方案,因为那时 A=500,但我预计 A=400

标签: r group-by dplyr summarize


【解决方案1】:

在编辑问题时更新

df%>%
  group_by(a)%>%
  summarise('max' = max(c), 'sum'=sum(c), b=max(b))

# A tibble: 2 x 4
#   a       max   sum     b
#  <chr>  <dbl>  <dbl> <dbl>
# 1 a        10    15   500
# 2 b         4     6   300

【讨论】:

    【解决方案2】:

    我会将summarise 替换为mutate(保留所有行),然后过滤您想要的行。然后 tibble 仍然被分组,因此需要一个 ungroup 来摆脱这些组。

    d f%>%
        group_by(a) %>%
        mutate('max' = max(c), 'sum'=sum(c)) %>% 
        filter(c == max) %>%
        ungroup()
    
    #   a         b     c   max   sum
    #   <chr> <dbl> <dbl> <dbl> <dbl>
    # 1 a       400    10    10    15
    # 2 b       300     4     4     6
    

    【讨论】:

    • 好的,但是如果相同的 c 值用于唯一的 a 怎么办?我上次编辑了数据。
    【解决方案3】:

    您必须指定如何汇总变量b

    df %>%
      group_by(a) %>%
      summarise(max = max(c), sum = sum(c), b = max(b[c == max(c)]))
    
    # # A tibble: 2 x 4
    #   a       max   sum     b
    #   <chr> <dbl> <dbl> <dbl>
    # 1 a        10    15   400
    # 2 b         4     6   300
    

    【讨论】:

    • 好的,但是如果相同的c 值用于唯一的a 怎么办?我上次编辑了数据。
    猜你喜欢
    • 2022-07-21
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2020-04-25
    相关资源
    最近更新 更多