R语言中仅按含*标记数值的最大绝对值对dataframe行排序的方法
实现代码
Base R 版本(无需额外安装包)
# 构造示例数据 a <- c("5*", 7, 9, "11***") b <- c("-8*", "-10*", -3, -1) c <- c(-4, -1, "-6**", "3*") df <- data.frame(a,b,c) # 计算每行的排序权重:仅取带*元素的最大绝对值 sort_weight <- apply(df, 1, function(row_items) { # 筛选当前行带*的元素 star_items <- row_items[grepl("\\*", row_items)] # 去掉所有*后转数值、取绝对值,求最大值 max(abs(as.numeric(gsub("\\*+", "", star_items))), na.rm = TRUE) }) # 按权重从高到低排序 df_sorted <- df[order(-sort_weight), ]
Tidyverse 版本
library(dplyr) df_sorted <- df %>% rowwise() %>% mutate( # 计算当前行带*元素的最大绝对值作为排序键 sort_key = max(abs(as.numeric(gsub("\\*+", "", c_across(everything()))[grepl("\\*", c_across(everything()))])), na.rm = T) ) %>% ungroup() %>% arrange(desc(sort_key)) %>% select(-sort_key)
输出结果
运行上述代码后得到的排序结果和预期一致:
a b c 4 11*** -1 3* 2 7 -10* -1 1 5* -8* -4 3 9 -3 -6**
内容的提问来源于stack exchange,提问作者JP_SC
相关产品推荐
相关产品推荐

