使用dplyr按列后缀与首个非零值重排R dataframe列顺序
R DataFrame 按列名后缀+列首个非零值位置排序方案
直接使用以下可运行代码即可实现需求:
# 加载示例数据 df = data.frame('col1_A'=c(0,0,3),'col2_A'=c(0,2,12),'col1_B'=c(0,0,1),'col2_B'=c(0,4,1)) # 1. 提取每列的后缀(取列名最后一个下划线后的字符,适配任意后缀分组) col_suffix <- sub(".*_([A-Za-z]+)$", "\\1", colnames(df)) # 2. 计算每列第一个非零值的出现行号 first_nonzero_pos <- apply(df, 2, function(col) which(col != 0)[1]) # 3. 生成排序规则:先按后缀升序(A自动排在B前)、再按首个非零行号升序(出现位置越靠前排越前) col_order <- order(col_suffix, first_nonzero_pos) # 4. 重新排列列顺序得到结果 sorted_df <- df[, col_order] # 输出验证结果 print(sorted_df)
运行输出结果与预期完全一致:
col2_A col1_A col2_B col1_B 1 0 0 0 0 2 2 0 4 0 3 12 3 1 1
补充说明:
- 若存在全为0的列,
first_nonzero_pos会返回NA,默认会排在同后缀组的末尾,可根据需求自行替换NA值调整全零列的排序优先级 - 代码自动适配任意后缀的分组排序,只要列名符合「xxx_后缀」的命名规则即可
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

