R语言按行剔除末尾无有效值零列生成新df1数据集的实现方法
R实现逐行剔除末尾无后续非零值的零列
需求说明
逐行校验数据集,仅保留每行最后一个非零值之前的所有列(含中间出现的零值列),剔除最后一个非零值之后的全零列。
实现代码
base R原生实现(无额外依赖)
# 示例数据集构造 df1 <- structure( list(date= c("2021-06-28","2021-06-28","2021-06-28","2021-06-28","2021-06-28", "2021-06-28","2021-06-28","2021-06-28"), DR01 = c(4,1,4,3,3,4,3,6), DR02= c(4,2,6,7,3,2,7,4),DR03= c(9,5,4,3,3,2,1,5), DR04 = c(5,4,3,3,6,2,1,9),DR05 = c(5,4,5,3,6,2,1,9), DR06 = c(2,4,3,3,5,6,7,8),DR07 = c(2,5,4,4,9,4,7,8), DR08 = c(0,0,0,1,2,0,0,0),DR09 = c(0,0,0,0,0,0,0,0),DR010 = c(0,0,0,0,0,0,0,0),DR011 = c(4,0,0,0,0,0,0,0), DR012 = c(0,0,0,3,0,0,0,5),DR013 = c(0,0,1,0,0,0,2,0),DR014 = c(0,0,0,1,0,2,0,0)), class = "data.frame", row.names = c(NA, -8L)) # 1. 定位数值列(排除第一列date) num_cols <- 2:ncol(df1) # 2. 逐行计算数值列中最后一个非零值的位置,兼容全零行 last_nonzero_pos <- apply(df1[, num_cols], 1, function(row) { non_zero_idx <- which(row != 0) ifelse(length(non_zero_idx) == 0, 0, max(non_zero_idx)) }) # 3. 逐行截取需要保留的列,得到每行独立长度的结果列表 result_list <- lapply(1:nrow(df1), function(i) { if (last_nonzero_pos[i] == 0) { # 数值列全零仅保留date return(df1[i, 1, drop=F]) } keep_cols <- c(1, num_cols[1:last_nonzero_pos[i]]) df1[i, keep_cols] }) # 4. (可选)统一转为等宽数据框,不足列补NA max_col_num <- max(last_nonzero_pos) + 1 result_df <- do.call(rbind, lapply(result_list, function(row_df) { col_gap <- max_col_num - ncol(row_df) if (col_gap > 0) { # 补全缺失列名 add_col_names <- paste0("DR", sprintf("%02d", (ncol(row_df):(max_col_num-1)))) row_df[add_col_names] <- NA } row_df }))
结果验证
- 第1行最后一个非零值在DR011(数值列第10位),最终保留列到DR011,符合需求
- 第2行最后一个非零值在DR07(数值列第7位),最终保留列到DR07,符合需求
内容的提问来源于stack exchange,提问作者user16774617
相关产品推荐
相关产品推荐

