如何用dplyr定位数据框中右侧全为0的最左零值列
问题:识别每行最左侧且右侧全为0的零值列
原始数据构造
首先构造示例数据框:
library(tidyverse) df <- data.frame(v1=c(0,1), v2=c(0,1),v3=c(0,1), v4=c(0,1)) %>% expand(v1, v2, v3, v4)
原始数据输出:
# A tibble: 16 x 4 v1 v2 v3 v4 <dbl> <dbl> <dbl> <dbl> 1 0 0 0 0 2 0 0 0 1 3 0 0 1 0 4 0 0 1 1 5 0 1 0 0 6 0 1 0 1 7 0 1 1 0 8 0 1 1 1 9 1 0 0 0 10 1 0 0 1 11 1 0 1 0 12 1 0 1 1 13 1 1 0 0 14 1 1 0 1 15 1 1 1 0 16 1 1 1 1
需求说明
为每行识别出最左侧的零值列,且该列右侧所有列均为0,不满足条件的行结果返回NA,预期输出需新增result列存储结果。
tidyverse 解决方案
使用rowwise()按行处理,结合循环判断条件:
df_result <- df %>% rowwise() %>% mutate( result = { # 获取当前行的所有列值和列名 row_vals <- c_across(everything()) col_names <- names(row_vals) # 从左到右遍历每个列位置 for (i in seq_along(row_vals)) { # 判断当前列是0,且右侧所有列均为0 if (row_vals[i] == 0 && all(row_vals[i:length(row_vals)] == 0)) { return(col_names[i]) } } # 无满足条件的列时返回NA return(NA_character_) } ) %>% ungroup()
输出结果
运行后得到符合预期的结果:
# A tibble: 16 x 5 v1 v2 v3 v4 result <dbl> <dbl> <dbl> <dbl> <chr> 1 0 0 0 0 v1 2 0 0 0 1 NA 3 0 0 1 0 v4 4 0 0 1 1 NA 5 0 1 0 0 v3 6 0 1 0 1 NA 7 0 1 1 0 v4 8 0 1 1 1 NA 9 1 0 0 0 v2 10 1 0 0 1 NA 11 1 0 1 0 v4 12 1 0 1 1 NA 13 1 1 0 0 v3 14 1 1 0 1 NA 15 1 1 1 0 v4 16 1 1 1 1 NA
内容的提问来源于stack exchange,提问作者Rajswa23
相关产品推荐
相关产品推荐

