R聚合列直到满足一个条件
R aggregate column until one condition is met
所以我有一个这种形式的数据框:
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
,我将不胜感激
提前致谢
也许你可以这样做:
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-08-04 创建
所以我有一个这种形式的数据框:
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
提前致谢
也许你可以这样做:
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-08-04 创建