R:按变量分组,将数字列与相应的字符列汇总

问题描述 投票:0回答:1

我有一个示例测试数据框:

YEAR <- c(2019, 2019,2020, 2020, 2019,2020,2020,2019,2020)
GROUP <- c("A","A","A", "A","B","B","B","A","B")
VALUE <- c(1,4,3, 8 ,5,3,2,6,7)
STATUS <- c("on","off", "off", "on", "on", "on", "off", "off", "off")

testdata <- data.frame(YEAR, GROUP, STATUS, VALUE)

按年份排列时看起来像这样: [1]:https://i.stack.imgur.com/aYgQh.png

我希望按年份和组进行分组,总结以获得最大值,我可以使用 dplyr 很好地做到这一点。

testdata %>%
  group_by(YEAR, GROUP) %>%
  summarise(max_value = max(VALUE))

但我希望输出具有分组的 YEAR 和 GROUP、max_value 以及与 max(VALUE) 对应的 STATUS。

我尝试了一些方法,但无法使其发挥作用。这很接近:

testdata %>%
  group_by(YEAR, GROUP) %>%
  summarise(max_value = max(VALUE),
            STATUS = first(STATUS))

但是输出不正确,因为它给出的是第一个 STATIS(显然),而不是与最大 VALUE 所在行对应的 STATUS。

例如。输出行之一是 2019, A, 6,在我希望它是 2019, A, 6, off 的位置。

这是一个测试数据集,我的实际数据是一个更大的时间序列,但我遇到了同样的问题。

希望能帮到你!

r dplyr group-by character summarize
1个回答
1
投票
library(tidyverse)

testdata |> 
  group_by(YEAR, GROUP) |> 
  slice_max(VALUE, n = 1)

# Groups:   YEAR, GROUP [4]
   YEAR GROUP STATUS VALUE
  <dbl> <chr> <chr>  <dbl>
1  2019 A     off        6
2  2019 B     on         5
3  2020 A     on         8
4  2020 B     off        7

或者:

testdata |> 
  slice_max(VALUE, n = 1, by = c(GROUP, YEAR))
© www.soinside.com 2019 - 2024. All rights reserved.