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]) )
运行后得到的结果如下,符合预期要求:
| ID | start | end |
|---|---|---|
| 1 | A1 | A2 |
| 2 | A1 | A5 |
| 3 | NA | NA |
内容的提问来源于stack exchange,提问作者user11418708
相关产品推荐
相关产品推荐

