【问题标题】:R aggregate column until one condition is metR聚合列,直到满足一个条件
【发布时间】:2020-08-04 16:55:48
【问题描述】:

所以我有一个这种形式的数据框:

ID   Var1   Var2
1     1      1
1     2      2
1     3      3
1     4      2
1     5      2
2     1      4
2     2      8
2     3      10
2     4      10
2     5      7

我想按组过滤 Var1 的最大值,条件是不满足 Var2 的最大值。这将是一个新数据帧的一部分,每个 ID 只包含一行,所以结果应该是这样的:

ID   Var1
1     2
2     2

所以函数应该过滤数据帧的最大值,但只考虑 Var2 达到最大值之前的行中的值。不应包含包含最大值本身的行,因此不应包含最大值之后的行。 我尝试使用while 循环构建一些东西,但没有成功。如果解决方案不使用data.table

,我也将不胜感激

提前致谢

【问题讨论】:

  • 如果var1的最大值在第一行而var2的最大值在第三行怎么办?你还会选择第 f2 行还是只选择第一行?
  • @Onyambu 如果 Var2 在第 3 行(关于一个组)中具有最大值,则该组中 Var1 的前两行将被考虑用于过滤。因此,在您的情况下,新的数据框/变量应该报告第一行中 Var1 的值

标签: r filter max aggregate plyr


【解决方案1】:

也许你可以这样做:

DF <- structure(list(
  ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), 
  Var1 = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L), 
  Var2 = c(1L, 2L, 3L, 2L, 2L, 4L, 8L, 10L, 10L, 7L)), 
  class = "data.frame", row.names = c(NA, -10L))

library(dplyr)

DF %>% group_by(ID) %>% 
  slice(1:(which.max(Var2)-1)) %>% 
  slice_max(Var1) %>% 
  select(ID, Var1)
#> # A tibble: 2 x 2
#> # Groups:   ID [2]
#>      ID  Var1
#>   <int> <int>
#> 1     1     2
#> 2     2     2

reprex package (v0.3.0) 于 2020 年 8 月 4 日创建

【讨论】:

  • 非常感谢您的回答!不知何故,R 找不到函数 slice_max 吗?
  • 也许你的dplyr 版本仍然需要top_n 而不是splice_max。见dplyr.tidyverse.org/reference/top_n.html
  • ... 因此top_n(n = 1, wt = Var1) %&gt;% 而不是slice_max(Var1) %&gt;%
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2021-08-24
  • 2013-12-28
  • 2020-08-29
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多