如何逐行检测首个触发后续仅为NA或逻辑值的缺失值列
逐行检测起始列:后续仅含NA或逻辑值
我们需要实现一个功能:对数据框的每一行,找出从哪一列开始,后续所有列的内容仅为NA或逻辑值(TRUE/FALSE)。注意:如果某列是NA,但后续列存在非NA且非逻辑值的内容,这个NA要被忽略,不算符合条件的起始点。
示例输入数据
library(tibble) data <- tibble( A = c(NA, TRUE, 2, NA, TRUE), B = c(1, NA, NA, 0, TRUE), C = c(TRUE, FALSE, NA, NA, FALSE), D = c(FALSE, TRUE, NA, FALSE, TRUE) )
数据打印结果:
# A tibble: 5 × 4 A B C D <dbl> <dbl> <lgl> <lgl> 1 NA 1 TRUE FALSE 2 1 NA FALSE TRUE 3 2 NA NA NA 4 NA 0 NA FALSE 5 1 1 FALSE TRUE
期望输出
output # A tibble: 5 × 2 row Column_NA <dbl> <chr> 1 1 NA 2 2 B 3 3 B 4 4 C 5 5 NA
解决方案代码
library(dplyr) library(purrr) detect_start_col <- function(df) { # 添加行号列 df <- df %>% mutate(row = row_number()) # 逐行处理逻辑 result <- df %>% rowwise() %>% mutate( Column_NA = { # 提取当前行的所有数据(排除行号列) row_vals <- c_across(-row) col_names <- names(row_vals) # 标记每个值是否为NA或逻辑值 is_valid <- map_lgl(row_vals, ~ is.na(.x) || is.logical(.x)) # 检查从每一列开始,后续所有列是否都满足条件 all_valid_from <- map_lgl(seq_along(col_names), ~ all(is_valid[.x:length(is_valid)])) # 取第一个符合条件的列名,无则返回NA first_col <- col_names[which(all_valid_from)[1]] if (length(first_col) == 0) NA else first_col } ) %>% select(row, Column_NA) %>% ungroup() return(result) } # 运行函数得到结果 output <- detect_start_col(data) print(output)
代码逻辑说明
- 先给原始数据添加行号列,方便对应结果到具体行;
- 逐行提取数据后,标记每个单元格的值是否为NA或逻辑值;
- 从左到右检查每一列:判断从该列开始的所有后续列是否都满足“NA或逻辑值”的条件;
- 取第一个符合条件的列名,若没有符合条件的列则返回NA;
- 最后整理成仅包含行号和结果列的输出数据框。
内容的提问来源于stack exchange,提问作者hendrik m
相关产品推荐
相关产品推荐

