如何在R中按行绝对值降序排序DataFrame且保留原值?
在R中按每行元素绝对值降序排序DataFrame(保留原数值)
要实现每行按元素绝对值降序排序且保留原正负值,用base R的apply函数就能直接完成,步骤如下:
- 构造示例数据(模拟你的输入场景):
df <- data.frame( col1 = c(-0.01189179, -0.04220260), col2 = c(0.03687456, 0.04129326), col3 = c(-0.12202753, -0.07178175) )
- 核心排序代码:
# 逐行按绝对值降序排列,保留原数值 sorted_df <- as.data.frame(t(apply(df, 1, function(row) { # 生成按绝对值降序的索引,用该索引重排列当前行元素 row[order(-abs(row))] }))) # 还原原列名(可选,若需要保持列名一致性) colnames(sorted_df) <- colnames(df)
- 查看最终结果:
运行代码后,sorted_df即为目标输出:
print(sorted_df) # 输出: # col1 col2 col3 # 1 -0.12202753 0.03687456 -0.01189179 # 2 -0.07178175 -0.04220260 0.04129326
代码逻辑说明
apply(df, 1, ...):指定对DataFrame的每行执行后续处理函数order(-abs(row)):计算当前行元素按绝对值降序排列的索引(-abs(row)实现降序排序)t(...):由于apply默认返回列优先的矩阵,转置后才能还原行结构as.data.frame(...):将转置后的矩阵转回DataFrame格式
如果你习惯用tidyverse工具链,也可以用以下方式实现:
library(dplyr) library(purrr) sorted_df_tidy <- df %>% rowwise() %>% mutate(sorted_row = list(cur_data()[order(-abs(cur_data()))])) %>% unnest_wider(sorted_row) %>% set_names(colnames(df))
内容的提问来源于stack exchange,提问作者legopel
相关产品推荐
相关产品推荐

