满足特定前置条件且第三行时间最晚的R数据框排序优化求助
高效实现R数据框的指定规则排序
需求回顾
需要将3行的tibble按以下规则排序:
- 第1行必须满足
is_x == 1 - 第2行必须满足
is_y == 1 - 在满足前两个条件的前提下,让第3行的
some_time值尽可能大
高效实现方案
无需生成所有排列,直接通过筛选-排序-拼接的方式实现,时间复杂度远低于全排列方案,代码如下:
library(dplyr) # 原始数据 df = tibble(id = letters[1:3], some_time = c(3,1,2), is_x = c(1,0,1), is_y = c(0,1,0) ) # 分离is_y=1的行 y_row <- df %>% filter(is_y == 1) # 筛选is_x=1且非y_row的行,按some_time升序排序 x_rows <- df %>% filter(is_x == 1, !id %in% y_row$id) %>% arrange(some_time) # 按规则拼接结果 final_df <- bind_rows( slice(x_rows, 1), # 第1行:取some_time最小的is_x行,留大值给第三行 y_row, # 第2行:固定is_y行 slice(x_rows, -1) # 第3行:剩余的is_x行,some_time最大 ) print(final_df)
输出结果
# A tibble: 3 × 4 id some_time is_x is_y <chr> <dbl> <dbl> <dbl> 1 c 2 1 0 2 b 1 0 1 3 a 3 1 0
方案说明
- 先固定第2行的
is_y == 1行,确保满足核心规则 - 对
is_x == 1的行按some_time升序排序,把最小的放在第1行,这样剩余的is_x行自然就是some_time最大的,放在第3行 - 整个过程仅涉及简单的筛选和一次排序,数据量越大,相比全排列方案的效率优势越明显
内容的提问来源于stack exchange,提问作者uneducated_ape
相关产品推荐
相关产品推荐

