You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:06:03