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

R语言如何获取dataframe每行非零值起止列名,全零行返回NA

解决方案

你的原有代码问题出在max.col()遇到全零行时会默认返回第一个位置的索引,无法识别全零场景,我们可以先对每行是否存在非零值做判断,再对全零行单独填充NA即可,完整代码如下:

# 读取示例数据为df1
df1 <- structure(list(ID = c(1, 2, 3), A1 = c(1, 1,0), A2 = c(1, 1,0), A3 = c(0, 
1,0), A4 = c(0, 1,0), A5 = c(0, 1,0)), class = c("spec_tbl_df", "tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -3L), spec = structure(list(
    cols = list(ID = structure(list(), class = c("collector_double", 
    "collector")), A1 = structure(list(), class = c("collector_double", 
    "collector")), A2 = structure(list(), class = c("collector_double", 
    "collector")), A3 = structure(list(), class = c("collector_double", 
    "collector")), A4 = structure(list(), class = c("collector_double", 
    "collector")), A5 = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1L), class = "col_spec"))

# 提取排除ID的数值列
val_cols <- df1[-1]
# 计算每行第一个、最后一个非零值的列索引
first_idx <- max.col(val_cols, "first")
last_idx <- max.col(val_cols, "last")
# 识别全零行
all_zero_rows <- rowSums(val_cols != 0) == 0

# 生成结果
result <- data.frame(
  ID = df1$ID,
  start = ifelse(all_zero_rows, NA, names(val_cols)[first_idx]),
  end = ifelse(all_zero_rows, NA, names(val_cols)[last_idx])
)

运行后得到的结果如下,符合预期要求:

IDstartend
1A1A2
2A1A5
3NANA

内容的提问来源于stack exchange,提问作者user11418708

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 02:45:03