R语言提取X列前两大值的所有行(含重复值)问题
解决方案
首先修正你原始数据中的语法错误(Y列里的"Z" "Y"缺少逗号,否则会报错):
df <- tibble( X = c("1", "1", "3", "3", "5", "5", "6", "6", "6"), Y = c("X", "Y", "X", "Z", "Z", "Y", "Y", "X", "Z") )
top_n函数的问题在于它是按行数取数,而非按唯一值的排名取数,所以当某个X值对应多行时,它无法提取所有属于前两大X值的行。以下是两种通用解决方法:
方法一:提取前两大唯一值后过滤
先提取X列的所有唯一值,筛选出数值最大的两个,再过滤原数据中X属于这两个值的所有行:
library(dplyr) # 获取前两大的X值(先转数值排序,再转回字符用于匹配) top_two_X <- df %>% distinct(X) %>% mutate(X_num = as.numeric(X)) %>% slice_max(order_by = X_num, n = 2) %>% pull(X) # 过滤目标行 output <- df %>% filter(X %in% top_two_X)
方法二:使用排名函数直接过滤
通过dense_rank计算X值的排名(相同值排名相同),直接筛选排名≤2的行:
output <- df %>% mutate(X_num = as.numeric(X)) %>% filter(dense_rank(desc(X_num)) <= 2) %>% select(-X_num) # 移除辅助列
运行后得到的output就是你需要的结果:
# A tibble: 5 × 2 X Y <chr> <chr> 1 5 Z 2 5 Y 3 6 Y 4 6 X 5 6 Z
内容的提问来源于stack exchange,提问作者Amphetamim
相关产品推荐
相关产品推荐

